提交时间:2024-01-21 14:50:47

运行 ID: 121020

#include<bits/stdc++.h> using namespace std; const int N=1e7+5; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); return x*f; } int p[20000005],sum[N<<1],cnt[N<<1]; int seed, n, k, S; int getrand() { seed = ((seed * 12321) ^ 9999) % 32768; return seed; } void generateData() { scanf( "%d%d%d", &k, &seed, &S ); int t = 0; n = k * 2 + 1; memset(p, 0, sizeof(p)); for( int i = 1; i <= n; ++i ) { p[i] = (getrand() / 128) % 2; t += p[i]; } int i = 1; while( t > k ) { while ( p[i] == 0 ) ++i; p[i] = 0; --t; } while( t < k ) { while( p[i] == 1 ) ++i; p[i] = 1; ++t; } } int main(){ generateData(); int id=0; for(int i = 1;i<=n;i++){ if(!p[i]){ id=i; break; } } for(int i = id+1;i!=id;i=i%n+1){ if(p[i])sum[i]=sum[i-1]+1; else sum[i]=sum[i-1]-1; } int maxn=0,now=id; for(int i = id;i<=n;i++){ if(!p[i]){ cnt[sum[i]+k]++; if(sum[i]>=maxn)maxn=sum[i],now=i; } } printf("%d\n",now);now=S+1; for(int i = n;i>=0;i--){ if(now>cnt[i])now-=cnt[i]; else { maxn=i-k; break; } } for(int i = n;i>=0;i--){ if(!p[i]&&maxn==sum[i]){ if(!(--now)){ now=i; break; } } } printf("%d\n",now); memset(cnt,0,sizeof cnt);assert(sum[id]==0); for(int i = id+1;i!=id;i=i%n+1){ if(p[i])sum[i]=sum[i-1]-1; else { sum[i]=sum[i-1]+1; } } for(int i = id;i<=n;i++){ if(!p[i]){ cnt[k-sum[i]]++; } } now=S+1; for(int i = 0;i<=n;i++){ if(now>cnt[i])now-=cnt[i]; else { maxn=k-i; break; } } for(int i = 1;i<=n;i++){ if(!p[i]&&maxn==sum[i]){ if(!(--now)){ now=i; break; } } } printf("%d\n",now); return 0; }