博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态 K th
阅读量:6420 次
发布时间:2019-06-23

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

  每一棵线段树是维护每一个序列前缀的值在任意区间的个数,如果还是按照静态的来做的话,那么每一次修改都要遍历O(n)棵树,时间就是O(2*M*nlogn)->TLE考虑到前缀和,我们通过树状数组来优化,即树状数组套主席树,每个节点都对应一棵主席树,那么修改操作就只要修改logn棵树,o(nlognlogn+Mlognlogn)时间是可以的,但是直接建树要nlogn*logn(10^7)会MLE我们发现对于静态的建树我们只要nlogn个节点就可以了,而且对于修改操作,只是修改M次,每次改变俩个值(减去原先的,加上现在的)也就是说如果把所有初值都插入到树状数组里是不值得的,所以我们分两部分来做,所有初值按照静态来建,内存O(nlogn),而修改部分保存在树状数组中,每次修改logn棵树,每次插入增加logn个节点O(M*logn*logn+nlogn)

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #define ls(i) T[i].ls 9 #define rs(i) T[i].rs 10 #define w(i) T[i].w 11 #define Find(i) (lower_bound(LX.begin(),LX.begin()+n1,i)-LX.begin())+1 12 13 using namespace std; 14 const int N=60000+10; 15 struct node{ 16 int ls,rs,w; 17 node(){ls=rs=w=0;} 18 }T[2000000]; 19 struct ope{ 20 int i,l,r,k; 21 }op[11000]; 22 vector
LX,Q1,Q2; 23 int n,n1,m,cnt; 24 int a[61000],root[61000*2]; 25 inline int lowbit(int x){ 26 return x&-x; 27 } 28 void build(int &i,int l,int r,int x){ 29 T[++cnt]=T[i]; i=cnt; 30 w(i)++; 31 if (l==r) return; 32 int m=(l+r)>>1; 33 if (x<=m) build(ls(i),l,m,x); 34 else build(rs(i),m+1,r,x); 35 } 36 void ins(int &i,int l,int r,int x,int v){ 37 if (i==0){ T[++cnt]=T[i]; i=cnt; } 38 w(i)+=v; 39 if (l==r) return; 40 int m=(l+r)>>1; 41 if (x<=m) ins(ls(i),l,m,x,v); 42 else ins(rs(i),m+1,r,x,v); 43 } 44 void my_ins(int pos,int x,int v){ 45 int t=Find(x); 46 for (int i=pos;i<=n;i+=lowbit(i)){ 47 ins(root[i],1,n1,t,v); 48 } 49 } 50 int Qy(vector
Q1,vector
Q2,int l,int r,int k){ 51 if (l==r) return l; 52 int c=0; 53 int m=(l+r)>>1; 54 for (int i=0;i
=k?ls(Q1[i]):rs(Q1[i])); 57 for (int i=0;i
=k?ls(Q2[i]):rs(Q2[i])); 58 59 if (c>=k) return Qy(Q1,Q2,l,m,k); 60 else return Qy(Q1,Q2,m+1,r,k-c); 61 } 62 void query(int l,int r,int k){ 63 Q1.clear();Q2.clear(); 64 Q1.push_back(root[l!=1?l-1+n:0]); 65 Q2.push_back(root[r+n]); 66 for (int i=l-1;i>0;i-=lowbit(i)) Q1.push_back(root[i]); 67 for (int i=r;i>0;i-=lowbit(i)) Q2.push_back(root[i]); 68 69 int t=Qy(Q1,Q2,1,n1,k); 70 printf("%d\n",LX[t-1]); 71 } 72 void work(){ 73 cnt=0; 74 //for (int i=0;i

 转自:http://www.cnblogs.com/Rlemon/archive/2013/05/24/3096264.html

转载于:https://www.cnblogs.com/CXCXCXC/p/5236054.html

你可能感兴趣的文章
我的友情链接
查看>>
ifconfig:command not found的解决方法
查看>>
js使用正则表达式判断手机和固话格式
查看>>
计算机是怎么存储数字的
查看>>
Codeforces Round #369 (Div. 2) A. Bus to Udayland 水题
查看>>
adb上使用cp/mv命令的替代方法(failed on '***' - Cross-device link解决方法)
查看>>
C++标准库简介、与STL的关系。
查看>>
Spring Boot 3 Hibernate
查看>>
查询EBS请求日志的位置和名称
查看>>
大型机、小型机、x86服务器的区别
查看>>
J2EE十三个规范小结
查看>>
算法(第四版)C#题解——2.1
查看>>
网关支付、银联代扣通道、快捷支付、银行卡支付分别是怎么样进行支付的?...
查看>>
大数据开发实战:Stream SQL实时开发一
查看>>
C++返回引用的函数例程
查看>>
dll 问题 (转)
查看>>
使用sql生成UUID
查看>>
mysql日期函数(转)
查看>>
REST API用得也痛苦
查看>>
test for windows live writer plugins
查看>>