NC216031. 宝石街
描述
输入描述
由于本题数据范围较大,部分测试点的将在程序内生成。
输入共行。
第行包含个正整数。
若,保证。第行包含个正整数,其中第个数表示。若,第行包含个正整数和。对于每个整数,设,则(其中是按位异或运算)。注意,本题的标准解法并不依赖于此数据生成方法。
输出描述
输出共行,包含个非负整数,表示小拥有的最多宝石数。
示例1
输入:
5 12 1 2 5 2 5 2
输出:
12
说明:
捡起点上的所有宝石;不扔宝石。C++(clang++11) 解法, 执行用时: 2009ms, 内存消耗: 235244K, 提交时间: 2021-01-04 17:49:10
#include<bits/stdc++.h> using namespace std; int a[60000005]; int main() { int i,l,r,n,op,p; long long x,y,t,s=0,S=0,ans=0; scanf("%d%lld%d",&n,&t,&op); if(op==1)for(i=1;i<=n;i++)scanf("%d",&a[i]); else { scanf("%d%d",&a[1],&p); for(i=2;i<=n;i++) { x=a[i-1]; x=x^(x<<13); y=x^(x>>17); a[i]=(y^(y<<5))%p+1; } } for(l=r=1;r<=n;r++,S+=s) { s+=a[r]; while(S>t)s-=a[l],S-=(long long)(r-l)*a[l],l++; ans=max(ans,s+(l>1?(t-S)/(r-l+1):0)); } printf("%lld\n",ans); return 0; }