整体二分。

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

#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. jvm类加载的过程

    java类加载过程:加载-->验证-->准备-->解析-->初始化,之后类就可以被使用了.绝大部分情况下是按这 样的顺序来完成类的加载全过程的.但是是有例外的地方,解析也是可以 ...

  2. BZOJ——1601: [Usaco2008 Oct]灌水

    http://www.lydsy.com/JudgeOnline/problem.php?id=1601 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit:  ...

  3. House Robber(动态规划)

    思路: 代码: class Solution { public: int rob(vector<int> &num) { ; int size=num.size(); ) ]; v ...

  4. luogu P1057 传球游戏

    题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同 ...

  5. Noip2017赛前的一些记录

    前言 已经退役整整五个月了....选考以后终于又摸上了键盘.... 但是码力已经大不如前了........ 距离比赛也就只有一星期了....那就胡乱的做一些题目吧QAQ 这里是一些根据算法分类的咋杂题 ...

  6. LightOj 1215 Finding LCM

    Discription LCM is an abbreviation used for Least Common Multiple in Mathematics. We say LCM (a, b, ...

  7. filter和spring 的interceptor都是单例的,都不是线程安全的

    Filter 是在 Servlet 容器启动时就初始化的,因此可以认为是以单例对象存在的,如果一个请求线程对其中的成员变量修改的话,会影响到其他的请求线程,因此认为是多线程不安全的.

  8. 如何突破Windows环境限制打开“命令提示符”

    如今,许多企业或组织都会通过使用受限的windows环境来减少系统表面的漏洞.系统加固的越好,那么也就意味着能被访问和使用到的功能就越少. 我最近遇到的情况是,一个已经加固的系统同时受到McAfee ...

  9. mycat安装和测试

    mycat安装和测试 一.  环境准备 本机环境是三台centos6.5 IP 主机名 数据库名 安装软件 192.168.17.4 master db1 mycat,mysql 192.168.17 ...

  10. WMS8_基本操作

    建立分拣[收货.出货.领料]         点击仪表盘上的任何一个 All operations 链接切换至分拣 列表视图         点击 creae 按钮,建立一个新的分拣     part ...