A题意(取余最长路):

  佳佳有一个n*m的带权矩阵,她想从(1,1)出发走到(n,m)且只能往右往下移动,她能得到的娱乐值为所经过的位置的权的总和。

有一天,她被下了恶毒的诅咒,这个诅咒的作用是将她的娱乐值变为对p取模后的值,这让佳佳十分的不开心,因为她无法找到一条能使她得到最大娱乐值的路径了!

她发现这个问题实在是太困难了,既然这样,那就只在3*n的矩阵内进行游戏吧!

现在的问题是,在一个3*n的带权矩阵中,从(1,1)走到(3,n),只能往右往下移动,问在模p意义下的移动过程中的权总和最大是多少。

n(1<=n<=100000),p(1<=p<=1000000000)。

  最简单的思路就是 搞一搞前缀和 枚举两个转折点 那么复杂度是n^2。BOOM!

  设三段的前缀和和 分别为s1,s2,s3  设转折点分别为(2,x1) (2,x2)

再仔细想一想p-1肯定是我们能得到的最大值,那么我们可以优化到枚举一个转折点(第二个转折点),前两段的结果丢在set里;

二分就OK了。

但是为了不影响二分的结果,做了一点改动(set不能丢入1,1->2,x1->2,x2)。应丢入1,1->2,x1->2,n 的和

前缀和表示为 s2[n]+s1[x1]-s2[x1-1];

二分的值变为((p-1)-(s3[n]-s3[x2-1])+((s2[n]-s2[x2]))+p)%p,每次更新答案就OK了

再观察一下发现插入和查询的时候都加了s2[n]

所以我们把s2[n]去掉=。=

然后s3[]用的一直是x2->n的和  这里应该用个后缀和的

写的时候手残读入错误,导致以为思路不对 --- 浪费了很多时间  (被自己气笑

PS:啊现在的我们是多么幸福,现成的STL啦啦啦;

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstring>
#include <set>
using namespace std;
const int maxn = 1e5+10;
typedef long long ll;
inline void r(ll&num){
    num=0;ll f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
    num*=f;
}
inline void r(int &num){
    num=0;int f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
    num*=f;
}
ll s1[maxn],s2[maxn],s3[maxn];
int main()
{
    int n;
    ll p;
    r(n),r(p);
    for(int i=1;i<=n;i++)
    {
        r(s1[i]);
        s1[i]=(s1[i]+s1[i-1])%p;
    }
     for(int i=1;i<=n;i++)
    {
        r(s2[i]);
        s2[i]=(s2[i]+s2[i-1])%p;
    }
     for(int i=1;i<=n;i++)
    {
        r(s3[i]);
        s3[i]=(s3[i]+s3[i-1])%p;
    }
    set<ll>s;
    ll ans = -1;
    set<ll>::iterator it;
    ll sum;
    ll cnt;
    for(int i=1;i<=n;i++)
    {
        s.insert(((s1[i]-s2[i-1])%p+p)%p);
        sum = (s3[n]-s3[i-1]+s2[i])%p;
        cnt = ((p-sum)%p+p)%p;
        it = s.lower_bound(cnt);
        if(it!=s.begin()) it--;
        ans = max(ans,((((*it)+sum)+p)%p));
    }
    cout<<ans<<endl;
    return 0;
}
有漏洞

相关文章:

  • 2021-05-16
  • 2021-10-02
  • 2021-06-14
  • 2022-02-12
  • 2021-07-02
  • 2021-07-22
  • 2021-11-08
  • 2022-02-22
猜你喜欢
  • 2021-05-27
  • 2021-09-07
  • 2022-01-10
  • 2021-07-09
  • 2021-08-20
  • 2022-02-11
  • 2021-05-20
相关资源
相似解决方案