1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include<bits/stdc++.h> using namespace std; typedef long long ll; #define int ll const int maxn=1e6+10,inf=0x3f3f3f3f,mod=1000000007; int d[maxn],sum[maxn],sum2[maxn],sum3[maxn]; int get(int a,int b,int n) { return sum[b+n-1]-sum[b-1]; } int getm(int a,int x,int n) { int l=1,r=a,ans=0; while(l<=r) { int mid=(l+r)>>1; if(sum3[a]-sum3[mid-1]>=x) l=mid+1,ans=mid; else r=mid-1; } return ans; } signed main() { std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #ifdef DEBUG freopen("input.in", "r", stdin); #endif for(int i=1;i<maxn;i++) sum[i]=sum[i-1]+i; int n,x,ans=0; cin>>n>>x; for(int i=1;i<=n;i++) cin>>d[i]; for(int i=1;i<=2*n;i++) { sum2[i]=sum2[i-1]; sum3[i]=sum3[i-1]; if(i<=n) sum2[i]+=get(i,1,d[i]),sum3[i]+=d[i]; else sum2[i]+=get(i-n,1,d[i-n]),sum3[i]+=d[i-n]; } for(int i=n+1;i<=2*n;i++) { int now=get(i,max(1ll,d[i-n]-x+1),min(x,d[i-n])),ret,tar; if(d[i-n]>=x) { ans=max(ans,now); continue; } else ret=x-d[i-n]; tar=getm(i-1,ret,n); now+=sum2[i-1]-sum2[tar]; ret-=sum3[i-1]-sum3[tar]; if(tar<=n) now+=get(tar,d[tar]-ret+1,ret); else now+=get(tar,d[tar-n]-ret+1,ret); ans=max(ans,now); } cout<<ans<<endl; return 0; }
|