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;
}

*/

 

posted @ 2023-09-09 16:25  JMXZ  阅读(120)  评论(0)    收藏  举报