【题解】
权值线段树。查询当前牌堆顶的牌并且删掉就好了。
#include<cstdio> #include<algorithm> #define N 3000010 #define rg register #define ls (u<<1) #define rs (u<<1|1) #define mid ((a[u].l+a[u].r)>>1) using namespace std; int n,now=1,tmp,rank; struct tree{ int l,r,cnt; }a[N]; inline int read(){ int k=0,f=1; char c=getchar(); while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); return k*f; } void build(int u,int l,int r){ a[u].l=l; a[u].r=r; a[u].cnt=a[u].r-a[u].l+1; if(l<r) build(ls,l,mid),build(rs,mid+1,r); } int query(int u){ a[u].cnt--; if(a[u].l==a[u].r) return a[u].l; if(rank<=a[ls].cnt) query(ls); else rank-=a[ls].cnt,query(rs); } int main(){ n=read(); build(1,1,n); while(n--){ now+=read(); now=(now-1)%(n+1)+1; rank=now; printf("%d\n",tmp=query(1)); } return 0; }
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。