整体二分。

主要需要注意的一点是,对于每个删除操作,若删除操作被算入贡献,则最开始的插入操作也一定会被算入,所以不必担心删除删错。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define LL long long
#define FILE "dealing"
#define up(i,j,n) for(int i=j;i<=n;i++)
int read(){
int x=0,f=1,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
const int maxn=800000,mod=1000000007,inf=10000000000000LL;
bool cmin(int& a,int b){return a>b?a=b,true:false;}
bool cmax(int& a,int b){return a<b?a=b,true:false;}
int ans[maxn];int n,m;
struct node{int x,y,k,id,op;}a[maxn],q1[maxn],q2[maxn];
char s[10];
int d[maxn],sum[maxn],v[maxn];
int lowbit(int x){return x&-x;}
void add(int x,int di){while(x<=n)d[x]+=di,x+=lowbit(x);}
int getsum(int x){int ans=0;while(x)ans+=d[x],x-=lowbit(x);return ans;}
void divide(int L,int R,int l,int r){
if(l>r)return;
if(L==R){
up(i,l,r)if(a[i].op==2)ans[a[i].id]=L;
return;
}
int mid=(L+R)>>1;
up(i,l,r){
if(a[i].op==1&&mid>=a[i].x)add(a[i].y,1);
if(a[i].op==2)sum[i]=getsum(a[i].y)-getsum(a[i].x-1);
if(a[i].op==3&&mid>=a[i].x)add(a[i].y,-1);
}
up(i,l,r){
if(a[i].op==1&&mid>=a[i].x)add(a[i].y,-1);
if(a[i].op==3&&mid>=a[i].x)add(a[i].y,1);
}
int top1=0,top2=0;
up(i,l,r){
if(a[i].op==2){
if(sum[i]<=a[i].k){
a[i].k-=sum[i];
q2[++top2]=a[i];
}else q1[++top1]=a[i];
}
else {
if(a[i].x<=mid)q1[++top1]=a[i];
else q2[++top2]=a[i];
}
}
up(i,l,l+top1-1)a[i]=q1[i-l+1];
up(i,l+top1,r)a[i]=q2[i-l-top1+1];
divide(L,mid,l,l+top1-1);
divide(mid+1,R,l+top1,r);
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
int T=read();
while(T--){
memset(ans,0,sizeof(ans));
n=read(),m=read();int top=n;
up(i,1,n){a[i].op=1;v[i]=a[i].x=read(),a[i].y=i,a[i].id=i;}
up(i,1,m){
scanf("%s",s);
if(s[0]=='Q')a[++top].op=2,a[top].x=read(),a[top].id=i,a[top].y=read(),a[top].k=read()-1;
else a[++top].op=3,a[top].y=read(),a[top].x=v[a[top].y],a[++top].op=1,a[top].x=read(),a[top].y=a[top-1].y,v[a[top].y]=a[top].x;
}
divide(0,mod,1,top);
up(i,1,m)if(ans[i])printf("%d\n",ans[i]);
}
return 0;
}

  

动态区间第K大的更多相关文章

  1. ZOJ 1112 Dynamic Rankings【动态区间第K大,整体二分】

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112 题意: 求动态区间第K大. 分析: 把修改操作看成删除与增加 ...

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

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

  3. ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)

    题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...

  4. ZOJ2112--Dynamic Rankings (动态区间第k大)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  5. 整体二分求动态区间第k大

    比树状数组套主席树不知道高到哪里去了,solve(l,r,L,R)就是对于L,R的操作区间的答案都在l,r区间里,然后递归下去 复杂度O(nlognlogn),每个操作会执行logn次就是o(nlog ...

  6. Dynamic_Rankings(动态区间第k大)

    ZOJ - 2112 \[ \ \] (那些说这道题是树状数组套主席树的人一定对主席树有误解!) 这里我们用树状数组套线段树来解决来写 首先 , 我们需要有n棵线段树(不是\(n^2\)空间,别慌) ...

  7. 整体二分(模板二)动态区间第K大

    这才是更一般的二分写法--HDU5412 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>// ...

  8. 静态区间第k大(主席树)

    POJ 2104为例(主席树入门题) 思想: 可持久化线段树,也叫作函数式线段树,也叫主席树(高大上). 可持久化数据结构(Persistent data structure):利用函数式编程的思想使 ...

  9. 【ZOJ2112】【整体二分+树状数组】带修改区间第k大

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

随机推荐

  1. Wireshark如何选择多行

    Wireshark如何选择多行   在Wireshark中,用户经常需要选择几行,然后进行批量操作,如导出或者分析.但Wireshark没有提供通过鼠标直接选择多行的功能.这个时候,用户需要采用标记分 ...

  2. eclipse不会自动编译的问题解决

    注意:非必要的时候,重新下载eclipse安装是最有效的解决方法. 以下为尝试的步骤: 1.看看project->Build Automatically有没有勾上?如果没有,勾上以后,clean ...

  3. SQL-基础学习3--通配符:LIKE,%,(_); 拼接:+,||,concat;

    第六课 用通配符进行过滤 6.1  LIKE操作符 通配符本身实际上是SQL的WHERE子句中有特殊含义的字符,SQL支持几种通配符.为在搜索子句中使用通配符,必须使用LIKE操作符.LIKE指示DB ...

  4. poj 2932 Coneology (扫描线)

    题意 平面上有N个两两不相交的圆,求全部最外层的,即不被其它圆包括的圆的个数并输出 思路 挑战程序竞赛P259页 代码 /* ************************************* ...

  5. java设计模式之-建造者模式

    建造者模式可以将复杂的构建与其表示相分离,是的相同的构建过程可以创建出不同的表示.     建造者模式与抽象工厂的差别是:在建造者模式里,有个指导者,这个指导者来管理建造者.用户与指导者相互联系,指导 ...

  6. SolidEdge 工程图中如何标注尺寸公差

    1 先标注基准框,输入基准符号(A B C之类的)   2 点击特征控制,设置马上要标注的特征和公差(可以保存为模板)   3 直接点击要标注的元素即可   4 没有基准的形位公差标注也一样  

  7. linux查看命令总结

    通过命令+文件名查看内容.如下命令可以查看.1, cat :由第一行开始显示文件内容:2,tac:从最后一行开始显示,可以看出tac与cat字母顺序相反:3,nl:显示的时候输出行号:4,more:一 ...

  8. H5实现多图片预览上传,可点击可拖拽控件介绍

    版权声明:欢迎转载,请注明出处:http://blog.csdn.net/weixin_36380516 在做图片上传时发现一个蛮好用的控件,支持多张图片同时上传,可以点击选择图片,也可以将图片拖拽到 ...

  9. Node.js知识点学习

    Node.js知识点学习 一.基本概念 Node.js,或者 Node,是一个可以让 JavaScript 运行在服务器端的平台.可以说,Node.js开创了javascript模块化开发的先河,早期 ...

  10. HMM MEMM CRF 差别 联系

    声明:本文主要是基于网上的材料做了文字编辑,原创部分甚少.參考资料见最后. 隐马尔可夫模型(Hidden Markov Model.HMM),最大熵马尔可夫模型(Maximum Entropy Mar ...