http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1149
没考虑数据范围,wrong了无数次,调的蛋蛋都碎了一地,幸亏师兄提点,才没让我万劫不复。。。
ACcode:
#include<stdio.h>
#include<iostream>
using namespace std;
const int size=111111;
int sum[size<<2],x[size],q[size],pos[size];
int Max(int a1,int a2)
{
return a1>a2?a1:a2;
}
void build(int rt,int l,int r)
{
sum[rt]=r-l+1;
if (l==r) return ;
int m=(l+r)>>1;
build(rt<<1,l,m);
build(rt<<1|1,m+1,r);
}
void update(int rt,int l,int r,int p,int i)
{
if (l==r)
{
sum[rt]=0;
pos[i]=r;
return ;
}
int m=(l+r)>>1;
if (sum[rt<<1]>=p) update(rt<<1,l,m,p,i);
else update(rt<<1|1,m+1,r,p-sum[rt<<1],i);
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
int query(int rt,int l,int r,int L,int R)
{
if (L<=l&&r<=R) return sum[rt];
if (l==r) return 0;
int m=(l+r)>>1,ans=0;
if (L<=m) ans+=query(rt<<1,l,m,L,R);
if (R>m) ans+=query(rt<<1|1,m+1,r,L,R);
return ans;
}
int main()
{
// freopen("input.txt","r",stdin);
// freopen("out.txt","w",stdout);
int n,m,A,B,M;
int s,x0,x1,i,k,maxs;
while (~scanf("%d %d %d %d %d %d",&n,&m,&x[1],&A,&B,&M))
{
build(1,1,n);
for (maxs=0,i=1;i<=m;i++)
{
scanf("%d",&q[i]);
maxs=Max(maxs,q[i]);
}
k=(x[1]+1)%sum[1];
if (!k) k=sum[1];
update(1,1,n,k,1);
for (i=2;i<=maxs;i++)
{
x[i]=(1LL*x[i-1]*A+B)%M;
int t=sum[1]-query(1,1,n,1,pos[i-1]);
k=(x[i]+1)%sum[1];
if (!k) k=sum[1];
if (k<=t) update(1,1,n,sum[1]-t+k,i);
else update(1,1,n,k-t,i);
}
for (i=1;i<=m;i++)
{
if (i>1) printf(" ");
printf("%d",pos[q[i]]);
}
printf("\n");
}
return 0;
}