5333. 【NOIP2017提高A组模拟8.23】大新闻 主席树/树套树
来源:互联网 发布:免费即时通讯软件 编辑:程序博客网 时间:2024/05/22 20:23
数据结构学傻选手。。。
题意:给出一个序列,每次可以在开头添加或删除,以及查询区间k大。
一看添加无脑树套树,成功fst,事实上只要一个主席树就可以了,倒过来每次覆盖掉。。
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int n,m,tot,top,sz;const int N=5e5+5;const int maxn=2e5;int v[N],num[N],hash[N];int flag[N],A[N],B[N],K[N],root[N];int sum[N*60],ls[N*60],rs[N*60],sta,end;int L[100],R[100],a,b;int lowbit(int x){return x&(-x);}int find(int x){ int l=1,r=tot,mid; while(l<=r) { int mid=(l+r)>>1; if(hash[mid]<x)l=mid+1; else r=mid-1; } return l;}void updata(int last,int l,int r,int &rt,int w,int x){ rt=++sz; sum[rt]=sum[last]+x;ls[rt]=ls[last];rs[rt]=rs[last]; if(l==r) return; int mid=(l+r)>>1; if(w<=mid) updata(ls[last],l,mid,ls[rt],w,x); else updata(rs[last],mid+1,r,rs[rt],w,x);}int query(int l,int r,int k){ if(l==r) return l; int i,suml=0,sumr=0; for(i=1;i<=a;i++) suml+=sum[ls[L[i]]]; for(i=1;i<=b;i++) sumr+=sum[ls[R[i]]]; int mid=(l+r)>>1; if(sumr-suml>=k) { for(i=1;i<=a;i++) L[i]=ls[L[i]]; for(i=1;i<=b;i++) R[i]=ls[R[i]]; return query(l,mid,k); } else { for(i=1;i<=a;i++) L[i]=rs[L[i]]; for(i=1;i<=b;i++) R[i]=rs[R[i]]; return query(mid+1,r,k-(sumr-suml)); }}int main(){ freopen("news.in","r",stdin); freopen("news.out","w",stdout); char s[3]; scanf("%d%d",&n,&m); sta=1+maxn,end=n+maxn; for(int i=sta;i<=end;i++) { scanf("%d",&v[i]); num[++top]=v[i]; } for(int i=1;i<=m;i++) { int op; scanf("%d",&op); if (op==1)A[i]=-1; else if (op==2)scanf("%d",&B[i]),num[++top]=B[i]; else {scanf("%d%d%d",&A[i],&B[i],&K[i]);flag[i]=1;} } sort(num+1,num+top+1); hash[++tot]=num[1]; for(int i=2;i<=top;i++) if(num[i]!=num[i-1]) hash[++tot]=num[i]; for(int i=sta;i<=end;i++) { int t=find(v[i]); for(int j=i;j<=end;j+=lowbit(j)) updata(root[j],1,tot,root[j],t,1); } for(int i=1;i<=m;i++) if(flag[i]) { A[i]+=sta-1; B[i]+=sta-1; a=0;b=0;A[i]--; for(int j=A[i];j>=sta;j-=lowbit(j)) L[++a]=root[j]; for(int j=B[i];j>=sta;j-=lowbit(j)) R[++b]=root[j]; printf("%d\n",hash[query(1,tot,K[i])]); } else { if (A[i]==-1) { sta++; continue; } sta--;int t; if (v[sta]) { t=find(v[sta]); for(int j=sta;j<=end;j+=lowbit(j)) updata(root[j],1,tot,root[j],t,-1); } v[sta]=B[i]; t=find(B[i]); for(int j=sta;j<=end;j+=lowbit(j)) updata(root[j],1,tot,root[j],t,1); } return 0;}
主席树:
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;const int N=3e5+5;const int inf=1e9;int n,m,sz,a[N],root[N*2];struct tree{int s,l,r;}t[N*2*30];void ins(int &d,int p,int l,int r,int x){ d=++sz;t[d]=t[p];t[d].s++; if (l==r) return; int mid=(l+r)/2; if (x<=mid) ins(t[d].l,t[p].l,l,mid,x); else ins(t[d].r,t[p].r,mid+1,r,x);}int query(int d,int p,int l,int r,int k){ if (l==r) return l; int mid=(l+r)/2; if (t[t[d].l].s-t[t[p].l].s>=k) return query(t[d].l,t[p].l,l,mid,k); else return query(t[d].r,t[p].r,mid+1,r,k-t[t[d].l].s+t[t[p].l].s);}int main(){ freopen("news.in","r",stdin); freopen("news.out","w",stdout); scanf("%d%d",&n,&m); for (int i=n;i>=1;i--) scanf("%d",&a[i]); for (int i=1;i<=n;i++) ins(root[i],root[i-1],1,inf,a[i]); while (m--) { int op; scanf("%d",&op); if (op==1) n--; else if (op==2) { int x; scanf("%d",&x); n++; ins(root[n],root[n-1],1,inf,x); } else { int l,r,k; scanf("%d%d%d",&l,&r,&k); printf("%d\n",query(root[n-l+1],root[n-r],1,inf,k)); } } return 0;}
阅读全文
0 0
- 5333. 【NOIP2017提高A组模拟8.23】大新闻 主席树/树套树
- 5333. 【NOIP2017提高A组模拟8.23】大新闻
- 【jzoj5333】【NOIP2017提高A组模拟8.23】【大新闻】【可持久化线段树】
- 【NOIP2017提高A组模拟8.23】密码
- jzoj5331 【NOIP2017提高A组模拟8.23】壕游戏
- 【JZOJ5332】【NOIP2017提高A组模拟8.23】密码
- A【NOIP2017提高组模拟12.18】
- 【JZOJ4928】【NOIP2017提高组模拟12.18】A
- 【NOIP2017提高组模拟12.18】A
- 【JZOJ4928】【NOIP2017提高组模拟12.18】A
- 【NOIP2017提高A组模拟7.7】图
- 【NOIP2017提高A组模拟7.13】abcd
- 区间【NOIP2017提高A组模拟7.10】
- 【NOIP2017提高A组模拟8.22】密码
- 【NOIP2017提高A组模拟8.24】早苗
- 【NOIP2017提高A组模拟8.24】提米树
- 空【NOIP2017提高A组模拟8.24】
- 【NOIP2017提高A组模拟8.25】影子
- 三问助你Debug
- 简单的 Android 社会化分享登录库,一行代码搞定
- rqt_plot的使用
- ubuntu配置tomcat
- 我所理解的前端性能优化
- 5333. 【NOIP2017提高A组模拟8.23】大新闻 主席树/树套树
- 画小圆点
- java ClassLoader详解
- 熟悉caffe
- 性能最高提升300%!阿里云数据库HBase版上线
- 动态广播
- 购买、配置阿里云Linux服务器配置ftp发布网站全教程
- 今天才发现printf不能直接输出string类型
- Uri结构与代码提取