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

    1.首先安装好Ansible环境,具体步骤请见Ansible安装 2.先创建hosts文件(为后面编写脚本安装JDK做铺垫) [root@localhost /]# vi hosts [jdktest ...

  2. the age of the TCP connection TCP Slow Start

    w防止网络过载和拥塞 HTTP The Definitive Guide The performance of TCP data transfer also depends on the age of ...

  3. linux 修改用户密码

    passwd 命令:用于对用户的密码进行管理,可以设置.修改.删除密码. 修改root用户的密码:$ sudo passwd root

  4. ifram+form方式实现文件、图片上传、预览

    1.前端代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  5. python - 安装/解释器/变量

    python的官网: https://www.python.org/ Python环境安装 Windows 安装https://www.python.org/downloads/windows/ Wi ...

  6. 适配器模式(Adapter Pattern)--不兼容结果的协调

    定义:将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper); 分类: 对象适配器:适配器与适配者之间是关联关系; 类适配器:适配器和适配者之间是继承 ...

  7. Python 之RabbitMQ使用

    1. IO 多路复用 # select 模拟socket server # server 端 import select import socket import sys import queue s ...

  8. git学习——<二>git配置文件

    一.git所有配置文件 <一>./etc/gitconfig全局配置文件 修改该配置文件,会对所有用户有影响. 使用git config --system来配置该文件 <二>. ...

  9. C的指针疑惑:C和指针13(高级指针话题)

    传递命令行参数 C程序的main函数具有两个形参.第一个通常称为argc,代表命令行参数的数目. 第二个通常称为argv,它指向一组参数值.由于参数的数目并没有内在的限制,所以argv指向这组参数值( ...

  10. POJ1836:Alignment(LIS的应用)

    题目链接:http://poj.org/problem?id=1836 题目要求: 给你n个数,判断最少去掉多少个数,从中间往左是递减的序列,往右是递增的序列 需注意的是中间可能为两个相同的值,如 1 ...