博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[bzoj1901]: Zju2112 Dynamic Rankings
阅读量:4680 次
发布时间:2019-06-09

本文共 3164 字,大约阅读时间需要 10 分钟。

  人生第一道树套树。。(虽然暑假就写了= =)

  这题是树状数组里面套个可持久化线段树。。。一开始想反了然后发现完全不会写TAT

  一般的树状数组操作的时候是直接修改数组里的值的,套上可持久化线段树后就变成在相应的那颗线段树里面修改了。

  修改操作就一个一个改,但查询第k大的时候要先把对应的线段树都存起来,然后一起算。。。

  具体见代码吧= =

1 #include
2 #include
3 #include
4 #include
5 #define rep1()for(register int i=1;i<=len1;i++) 6 #define rep2()for(register int i=1;i<=len2;i++) 7 using namespace std; 8 const int maxn=20233; 9 int num[maxn*17*17],lc[maxn*17*17],rc[maxn*17*17],rt[maxn];10 int L[20],R[20];11 struct zs{12 int num,id;13 }a[maxn];14 struct ask{15 int l,r,x;16 bool id;17 }q[10023];18 int b[maxn],c[maxn];19 int i,j,cnt,n,m,tot,len1,len2;20 21 int ra;char rx;22 inline int read(){23 rx=getchar(),ra=0;24 while(rx<'0'||rx>'9')rx=getchar();25 while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra;26 }27 28 inline int sum1(){
int sum=0;rep1()sum+=num[L[i]];return sum;}29 inline int sum2(){
int sum=0;rep2()sum+=num[R[i]];return sum;}30 31 inline void run1(int x){
for(len1=0;x;x-=x&(-x))L[++len1]=rt[x];}32 inline void run2(int x){
for(len2=0;x;x-=x&(-x))R[++len2]=rt[x];}33 34 void ins(int pre,int &now,int l,int r,int v){35 now=++tot;num[now]=num[pre]+1;36 if(l==r)return;int mid=(l+r)>>1;37 if(v<=mid)rc[now]=rc[pre],ins(lc[pre],lc[now],l,mid,v);38 else lc[now]=lc[pre],ins(rc[pre],rc[now],mid+1,r,v);39 }40 int query(int l,int r,int k){41 if(l==r)return l;42 int mid=(l+r)>>1,lsize=0;43 rep1()lsize-=num[lc[L[i]]];rep2()lsize+=num[lc[R[i]]];44 if(lsize>=k){45 rep1()L[i]=lc[L[i]];rep2()R[i]=lc[R[i]];46 return query(l,mid,k);47 }else{48 rep1()L[i]=rc[L[i]];rep2()R[i]=rc[R[i]];49 return query(mid+1,r,k-lsize);50 }51 }52 void change(int pre,int &now,int l,int r,int v,bool del){53 now=++tot,num[now]=num[pre]-(del?1:-1);54 if(l==r)return;int mid=(l+r)>>1;55 if(v<=mid)rc[now]=rc[pre],change(lc[pre],lc[now],l,mid,v,del);56 else lc[now]=lc[pre],change(rc[pre],rc[now],mid+1,r,v,del);57 }58 void build(int l,int r,int &x){59 x=++tot;60 if(l==r)build(l,(l+r)>>1,lc[x]),build(((l+r)>>1)+1,r,rc[x]);61 }62 bool cmp(zs a,zs b){
return a.num
n)q[a[i].id-n].x=cnt;77 }78 build(1,cnt,rt[0]);for(i=1;i<=n;i++)rt[i]=rt[0];79 // for(i=1;i<=m;i++)if(q[i].id)printf(" %d\n",q[i].x);80 for(i=1;i<=n;i++)for(j=i;j<=n;j+=j&(-j))ins(rt[j],rt[j],1,cnt,b[i]);81 for(i=1;i<=m;i++){82 if(q[i].id){83 run1(q[i].l-1),run2(q[i].r);84 // printf(" %d--%d %d %d\n",q[i].l,q[i].r,len1,len2);85 // for(j=1;j<=len1;j++)printf(" %d",L[j]);puts("!!");for(j=1;j<=len2;j++)printf(" %d",R[j]);puts("");puts("!");86 printf("%d\n",c[query(1,cnt,q[i].x)]);87 }88 else {89 for(j=q[i].l;j<=n;j+=j&(-j))change(rt[j],rt[j],1,cnt,b[q[i].l],1);90 for(j=q[i].l;j<=n;j+=j&(-j))change(rt[j],rt[j],1,cnt,q[i].x,0);91 b[q[i].l]=q[i].x;92 }93 }94 return 0;95 }
View Code

 

转载于:https://www.cnblogs.com/czllgzmzl/p/5127219.html

你可能感兴趣的文章
nginx配置
查看>>
2014-11-9------- 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。...
查看>>
python 魔法方法补充(__setattr__,__getattr__,__getattribute__)
查看>>
NOIP 2010 关押罪犯
查看>>
CentOS7.5删除旧的内核
查看>>
Java常用的非受检异常
查看>>
HDOJ-2054
查看>>
centos7安装eclipse
查看>>
Web:AJAX的详解
查看>>
两种比较器Comparable 和 Comparator
查看>>
S2JDBC テーブルを利用した独自仕様のid採番メソッド
查看>>
P3698 [CQOI2017]小Q的棋盘
查看>>
动态规划入门 洛谷P2409 Y的积木
查看>>
【第一季】CH04_FPGA设计Verilog基础(一)Enter a post title
查看>>
Mysql全文索引
查看>>
[LeetCode] 148. Sort List 链表排序
查看>>
jmeter(四十四)常用性能指标分析
查看>>
6个出色的基于JQuery的Tab选项卡实例2010/01/29 16:261. jQuery 选项卡界面 / 选项卡结构菜单教程...
查看>>
F - 八苦を滅した尼公 POJ - 2763 线段树LCA
查看>>
通过jQuery源码学习javascript(一)
查看>>