P1982 [NOIP2013 普及组] 小朋友的数字

手牌 、特征值=前面<= 连续手牌值最大,分数=前面< 分数最大
》连续手牌值的最大
f[i]以i结束的连续和的最大值 f[i]=max(f[i-1]+a[i],a[i])
h[i]前i个连续和的最大值 h[i]=max(h[i-1],f[i])
:::数据会超 1e20 左右->__int128 36位
:::负数mod 会出问题
#include<cstdio> #include<iostream> #include<algorithm> //#include<queue> //#include<vector> //#include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------------\n"); using namespace std; const int maxn=1e6+10 ; __int128 a[maxn],b[maxn],c[maxn],s[maxn],f[maxn],n,m,ans,mod; inline __int128 read(){ __int128 res=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar();} while(ch>='0'&&ch<='9'){ res=res*10+ch-'0'; ch=getchar();} return res*f; } inline __int128 maxx(__int128 a,__int128 b){return a>=b? a:b; } inline __int128 minn(__int128 a,__int128 b){return a<=b? a:b; } inline __int128 abss(__int128 a){return a>=0? a:-a; } int main() { ios::sync_with_stdio(false); n=read(),mod=read(); for(int i=1;i<=n;i++) a[i]=read(); b[1]=f[1]=a[1]; for(int i=2;i<=n;i++) { f[i]=maxx(f[i-1]+a[i],a[i]); b[i]=maxx(b[i-1],f[i]); } c[1]=b[1]; s[1]=b[1]+c[1]; ans=c[1]; for(int i=2;i<=n;++i) { c[i]=s[i-1]; s[i]=max(s[i-1],c[i]+b[i]); ans=max(ans,c[i]); } if(ans>=0)ans=ans%mod; else ans=-(abss(ans)%mod); long long haha=ans; printf("%lld\n",haha); return 0; } /* #include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int Maxn=1000000+10,inf=0x3f3f3f3f; __int128 a[Maxn],f[Maxn],s[Maxn],b[Maxn],c[Maxn]; __int128 n,mod,ans; inline __int128 read() { __int128 s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar(); return s*w; } inline __int128 max(__int128 x,__int128 y){return x>y ? x : y;} inline __int128 min(__int128 x,__int128 y){return x<y ? x : y;} inline __int128 abs(__int128 x) //abs不知道用algorithm会不会出锅 { if(x>=0) return x; return -x; } void print(__int128 x){ if(x<0) putchar('-'),x=-x; if(x==0) return; if(x>9) print(x/10); putchar(x%10+'0'); } int main() { n=read(),mod=read(); for(int i=1;i<=n;++i) a[i]=read(); b[1]=s[1]=f[1]=a[1]; for(int i=2;i<=n;++i) { f[i]=max(f[i-1]+a[i],a[i]); b[i]=max(b[i-1],f[i]); } c[1]=b[1]; s[1]=b[1]+c[1]; ans=c[1]; for(int i=2;i<=n;++i) { c[i]=s[i-1]; s[i]=max(s[i-1],c[i]+b[i]); ans=max(ans,c[i]); } if(ans>=0)ans=ans%mod; else ans=-(abs(ans)%mod); print(ans); // long long haha=ans; // printf("%lld\n",haha); return 0; } */

浙公网安备 33010602011771号