裸的线段树的题,就像值域线段树一样记录一下size查询rank就好了……
喵的……为什么windows下跑得这么慢…………于是我对着AC的代码调了一上午……
极限数据本机三秒三,交上去0.4s……
惨啊……优化常数搞了一上午写了人生第一发读入输出优化2333
#include<bits/stdc++.h>
#define MAXN 700023
//#define FLAZE_NAIVE
using namespace std; int N,n;
int dt[MAXN<<3];
void build(int now,int l,int r){
if(l==r) return dt[now]=1,void();
int mid=(l+r)>>1;
build(now<<1,l,mid);
build(now<<1|1,mid+1,r);
dt[now]=r-l+1;
}
int inqry(int now,int l,int r,int rk){
#ifdef FLAZE_NAIVE
printf("l = %d r = %d siz[ now ] = %d\n",l,r,dt[now]);
#endif
if(l==r) return dt[now]=0,l;
int mid=(l+r)>>1;
int rtn;
if(rk<=dt[now<<1]) rtn=inqry(now<<1,l,mid,rk);
else rtn=inqry(now<<1|1,mid+1,r,rk-dt[now<<1]);
--dt[now];
return rtn;
}
char read_s[10];
int read_rtn,lth;
int read(){
read_rtn=0;
scanf("%s",read_s);
lth=strlen(read_s);
for(int i=0;i<lth;++i)
read_rtn=read_rtn*10+read_s[i]-'0';
return read_rtn;
}
void write(int x){
lth=0;
while(x)
read_s[lth++]=x%10+'0',x/=10;
for(int i=lth-1;~i;--i) putchar(read_s[i]);
putchar('\n');
}
int read_r;
int main(){
// scanf("%d",&n);
n=read();
N=n;
build(1,1,N);
int now=1;
int kk;
while(n){
read_r=read();
// scanf("%d",&read_r);
#ifdef FLAZE_NAIVE
printf("r = %d now = %d n = %d\n",read_r,now,n);
#endif
read_r=(read_r+now)%n;
if(!read_r) read_r=n;
#ifdef FLAZE_NAIVE
printf("rank = %d\n",read_r);
#endif
now=read_r;
kk=inqry(1,1,N,read_r);
write(kk);
// printf("%d\n",inqry(1,1,N,read_r));
--n;
}
return 0;
}