整体二分。

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

#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. css-通过css让块显示或隐藏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Gaugecontrol(测量仪器图形控件)

    digital 数字类 circularfull 整圆 circularhalf 半圆 circularquarter 四分之一圆 circularThreeFourth 四分之三圆 linear h ...

  3. HDU 5266 pog loves szh III(区间LCA)

    题目链接 pog loves szh III 题意就是  求一个区间所有点的$LCA$. 我们把$1$到$n$的$DFS$序全部求出来……然后设$i$的$DFS$序为$c[i]$,$pc[i]$为$c ...

  4. C# 生成二维码(带Logo)

    C# 生成二维码(带Logo) 第一种方式 我们需要引用 ThoughtWorks.QRCode.dll  生成带logo二维码(framework4.0以上) 下载地址:https://pan.ba ...

  5. Zab算法详解

    Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量 ...

  6. session转载

    sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应.tomcat生成的sessionid叫做jsessionid. ses ...

  7. Android Service实现双向通信(一)

    首先,大概来总结一下与Service的通信方式有很多种: 通过BroadCastReceiver:这种方式是最简单的,只能用来交换简单的数据: 通过Messager:这种方式是通过一个传递一个Mess ...

  8. LINUX6.5 + MYSQL5.6 + JIRA6.3 + CONFLUENCE5.9

    #================MYSQL=============================    [root@localhost Desktop]# /sbin/ifup eth0[roo ...

  9. Android动画中Interpolator 详解和演示

    遇到一个项目需求,想让动画变得更活泼一点,于是想到了动画属性中的Interpolator,写了基本例子测试一下Android提供给我们现成的加速器的效果: 效果 代码中方法 xml中属性 越来越快 A ...

  10. 深度排序与alpha混合 【转】

      翻译:李现民 最后修改:2012-07-03 原文:Depth sorting alpha blended objects 先说个题外话,本来我想回答在 Creators Club论坛上的一个常见 ...