设为首页 加入收藏

TOP

hdu 5919--Sequence II(主席树--求区间不同数个数+区间第k大)(二)
2017-10-16 18:20:50 】 浏览:7227
Tags:hdu 5919--Sequence 主席 区间 不同 数个数
L) sum+=query(tr[now].l,l ,mid,L,R); if(mid<R) sum+=query(tr[now].r,mid+1,r,L,R); return sum; } int finds(int now,int l,int r,int k) { if(l==r) return l; int mid=(l+r)>>1; if(tr[tr[now].l].num>=k) return finds(tr[now].l,l,mid,k); else return finds(tr[now].r,mid+1,r,k-tr[tr[now].l].num); } int main() { int T,Case=1; cin>>T; while(T--) { init(); int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); t[n+1]=build(1,n); for(int i=n;i>=1;i--) { if(mp.count(a[i])) { int tmp=update(t[i+1],1,n,mp[a[i]],-1); t[i]=update(tmp,1,n,i,1); } else t[i]=update(t[i+1],1,n,i,1); mp[a[i]]=i; } ans[0]=0; for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); int l=min((x+ans[i-1])%n+1,(y+ans[i-1])%n+1); int r=max((x+ans[i-1])%n+1,(y+ans[i-1])%n+1); int k=(query(t[l],1,n,l,r)+1)/2; ans[i]=finds(t[l],1,n,k); } printf("Case #%d:",Case++); for(int i=1;i<=m;i++) printf(" %d",ans[i]); puts(""); } return 0; } /** 10 4 1 1 1 1 1 1 1 1 1 1 3 6 6 8 7 10 2 5 */

 

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇UVA 10755 Garbage Heap 下一篇【luogu 1908】逆序对

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目