每一棵线段树是维护每一个序列前缀的值在任意区间的个数,如果还是按照静态的来做的话,那么每一次修改都要遍历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)

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#define ls(i) T[i].ls
#define rs(i) T[i].rs
#define w(i) T[i].w
#define Find(i) (lower_bound(LX.begin(),LX.begin()+n1,i)-LX.begin())+1 using namespace std;
const int N=+;
struct node{
int ls,rs,w;
node(){ls=rs=w=;}
}T[];
struct ope{
int i,l,r,k;
}op[];
vector<int> LX,Q1,Q2;
int n,n1,m,cnt;
int a[],root[*];
inline int lowbit(int x){
return x&-x;
}
void build(int &i,int l,int r,int x){
T[++cnt]=T[i]; i=cnt;
w(i)++;
if (l==r) return;
int m=(l+r)>>;
if (x<=m) build(ls(i),l,m,x);
else build(rs(i),m+,r,x);
}
void ins(int &i,int l,int r,int x,int v){
if (i==){ T[++cnt]=T[i]; i=cnt; }
w(i)+=v;
if (l==r) return;
int m=(l+r)>>;
if (x<=m) ins(ls(i),l,m,x,v);
else ins(rs(i),m+,r,x,v);
}
void my_ins(int pos,int x,int v){
int t=Find(x);
for (int i=pos;i<=n;i+=lowbit(i)){
ins(root[i],,n1,t,v);
}
}
int Qy(vector<int> Q1,vector<int> Q2,int l,int r,int k){
if (l==r) return l;
int c=;
int m=(l+r)>>;
for (int i=;i<Q1.size();i++) c-=w(ls(Q1[i]));
for (int i=;i<Q2.size();i++) c+=w(ls(Q2[i]));
for (int i=;i<Q1.size();i++) Q1[i]=(c>=k?ls(Q1[i]):rs(Q1[i]));
for (int i=;i<Q2.size();i++) Q2[i]=(c>=k?ls(Q2[i]):rs(Q2[i])); if (c>=k) return Qy(Q1,Q2,l,m,k);
else return Qy(Q1,Q2,m+,r,k-c);
}
void query(int l,int r,int k){
Q1.clear();Q2.clear();
Q1.push_back(root[l!=?l-+n:]);
Q2.push_back(root[r+n]);
for (int i=l-;i>;i-=lowbit(i)) Q1.push_back(root[i]);
for (int i=r;i>;i-=lowbit(i)) Q2.push_back(root[i]); int t=Qy(Q1,Q2,,n1,k);
printf("%d\n",LX[t-]);
}
void work(){
cnt=;
//for (int i=0;i<n1;i++) cout<<list[i]<<" ";cout<<endl;
memset(root,,sizeof(root));
for (int i=;i<=n;i++){
root[i+n]=root[i-+n];
int t=Find(a[i]);
build(root[i+n],,n1,t);
}
for (int i=;i<m;i++){
if (op[i].i==){
query(op[i].l,op[i].r,op[i].k);
// cout<<"*** "<<i<<endl;
}else{
my_ins(op[i].l,a[op[i].l],-);
my_ins(op[i].l,op[i].r,);
a[op[i].l]=op[i].r;
}
} }
int main(){
int Cas;scanf("%d",&Cas);
while (Cas--){
scanf("%d%d",&n,&m);
LX.clear();
for (int i=;i<=n;i++){
scanf("%d",&a[i]);LX.push_back(a[i]);
}
char s[];
for (int i=;i<m;i++){
scanf("%s",s);
if (s[]=='Q'){
op[i].i=;
scanf("%d%d%d",&op[i].l,&op[i].r,&op[i].k);
}else{
op[i].i=;
scanf("%d%d",&op[i].l,&op[i].r);
LX.push_back(op[i].r);
}
}
sort(LX.begin(),LX.end());
n1=unique(LX.begin(),LX.end())-LX.begin();
work();
} return ;
}

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

动态 K th的更多相关文章

  1. 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题

    达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...

  2. COJ 0986 WZJ的数据结构(负十四) 区间动态k大

    题解:哈哈哈我过了!!!主席树+树状数组写起来还真是hentai啊... 在这里必须分享我的一个沙茶错!!!看这段代码: void get(int x,int d){ ]=root[x];x;x-=x ...

  3. BZOJ 1901 Zju2112 Dynamic Rankings

    树阵主席设置树.维护间隔动态K大. .. ZOJ到空间太小,太大,仅仅能到BZOJ上交 1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memor ...

  4. django模型操作

    Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表        

  5. 数据可视化:Echart中k图实现动态阈值报警及实时更新数据

    1 目标 使用Echart的k图展现上下阈值,并且当真实值超过上阈值或低于下阈值时候,标红报警. 2 实现效果 如下:

  6. 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))

    函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...

  7. hdu5412(动态区间第k大)

    CRB and Queries Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  8. zoj 2112 动态区间求第k大

    题目大意: 动态单点更新,然后多次询问求区间内第k大 这里单个的主席树不能实现,这里采取的是树状数组套主席树 首先可以想的是将静态主席树先构建好,不去动它,这里空间复杂度就是O(nlogn),这个只要 ...

  9. zoj 2112 Dynamic Rankings 动态第k大 线段树套Treap

    Dynamic Rankings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...

随机推荐

  1. python2--升级python3

    先安装开发工具包: yum -y group install "Development Tools" 安装Python的依赖包: yum -y install openssl-de ...

  2. 查看执行计划plustrace:set autotrace trace exp stat(SP2-0618、SP2-0611)

    执行计划是SQL获取和处理数据的途径和方法. 执行计划和性能 SQL -- 数据库性能的始作俑者 所有的数据库性能,几乎全部来自SQL. 优秀的SQL是数据库最大的福祉. 一条很烂的SQL,可以搞瘫一 ...

  3. [linux基础学习]默认的目录介绍

    以下用一个表格来罗列linux默认的目录或文件及其用途: 目录/文件 用途 来源 / /处于Linux文件系统树形结构的最顶端,它是Linux文件系统的入口,所有的目录.文件.设备都在/之下. - / ...

  4. 剖析Docker文件系统:Aufs与Devicemapper

    http://www.infoq.com/cn/articles/analysis-of-docker-file-system-aufs-and-devicemapper Docker镜像 典型的Li ...

  5. [已解决]ubuntu下chrome和firefox输入框内无法快捷键全选

    问题现象: 在chrome或firefox浏览器(其他地方没试)的输入框中使用ctr + a进行全选失效,在google中找到了这个已经解决的http://askubuntu.com/question ...

  6. 关于spring的applicationContext.xml配置文件的ref和value之自我想法

    今天在做SSH的一个项目的时候,因为需要定时操作,所以就再sping里面加入了一个quartz的小定时框架,结果在运行时候,发生了一个小bug. Caused by: org.springframew ...

  7. VS调用python方法

    1.  安装python3.7 2.  Vs2010中配置python: 3.添加头文件:#include <Python.h> 4.问题:error LNK2001: 无法解析的外部符号 ...

  8. Favorite Donut--hdu5442(2015年长春网选赛,kmp,最大表示法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5442 打比赛的时候还没学kmp更没有学最大最小表示法,之后做完了kmp的专题,学了它们,现在再来做这道 ...

  9. python发送邮件的2种方式

    发送邮件的2种方式1.匿名发送 smtpObj = smtplib.SMTP(host, port) smtpObj.sendmail(from_addr, to_addrs, message.as_ ...

  10. 0602-Zuul构建API Gateway-Zuul Http Client、cookie、header

    一.Zuul Http Client zuul使用的默认HTTP客户端现在由Apache HTTP Client支持,而不是已弃用的Ribbon RestClient.要使用RestClient或使用 ...