题解:很显然的树套树 主席树+树状数组 动态维护区间权值 然后类似于查询区间第K大 复杂度nlog^2n 空间也如此

#include <bits/stdc++.h>
const int MAXN=2e4+10;
using namespace std;
int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return f*x;
}
typedef struct node{int l,r,sum;
}node;
node d[MAXN*201];
int rt[MAXN];
int cnt;
int get_id(int x){return x&(-x);}
void update(int &x,int y,int l,int r,int t,int vul){x=++cnt;d[x]=d[y];d[x].sum+=vul;if(l==r)return ;int mid=(l+r)>>1;if(t<=mid)update(d[x].l,d[y].l,l,mid,t,vul);else update(d[x].r,d[y].r,mid+1,r,t,vul);
}
int ans,sum;
vector<int>v1;
vector<int>v2;
void querty(int l,int r,int k){if(l==r){ans=l;return ;}sum=0;int mid=(l+r)>>1;for(int i=0;i<v1.size();i++)sum+=d[d[v1[i]].l].sum;for(int i=0;i<v2.size();i++)sum-=d[d[v2[i]].l].sum;// cout<<l<<" "<<r<<" "<<sum<<endl;if(k<=sum){for(int i=0;i<v1.size();i++)v1[i]=d[v1[i]].l;for(int i=0;i<v2.size();i++)v2[i]=d[v2[i]].l;querty(l,mid,k);}else{for(int i=0;i<v1.size();i++)v1[i]=d[v1[i]].r;for(int i=0;i<v2.size();i++)v2[i]=d[v2[i]].r;querty(mid+1,r,k-sum);}
}
vector<int>vec;
int a[MAXN];
typedef struct Q{int op,l,r,k;
}Q;
Q q[MAXN];
int main(){int n,m;n=read();m=read();for(int i=1;i<=n;i++)a[i]=read(),vec.push_back(a[i]);char ch;for(int i=1;i<=m;i++){scanf(" %c",&ch);if(ch=='Q'){q[i].op=1;q[i].l=read();q[i].r=read();q[i].k=read();}else{q[i].op=2;q[i].l=read();q[i].r=read();vec.push_back(q[i].r);}}sort(vec.begin(),vec.end());int sz=unique(vec.begin(),vec.end())-vec.begin();for(int i=1;i<=n;i++){a[i]=lower_bound(vec.begin(),vec.begin()+sz,a[i])-vec.begin()+1;
//  cout<<a[i]<<" ";for(int j=i;j<=n;j+=get_id(j))update(rt[j],rt[j],1,sz,a[i],1);
//  cout<<endl;}
//    cout<<endl;for(int i=1;i<=m;i++){if(q[i].op==2){q[i].r=lower_bound(vec.begin(),vec.begin()+sz,q[i].r)-vec.begin()+1;for(int j=q[i].l;j<=n;j+=get_id(j))update(rt[j],rt[j],1,sz,a[q[i].l],-1),update(rt[j],rt[j],1,sz,q[i].r,1);a[q[i].l]=q[i].r;}else{v1.clear();v2.clear();
//      cout<<q[i].l<<" "<<q[i].r<<" "<<q[i].k<<endl;for(int j=q[i].r;j>0;j-=get_id(j))v1.push_back(rt[j]);// cout<<endl;for(int j=q[i].l-1;j>0;j-=get_id(j))v2.push_back(rt[j]);// cout<<endl;querty(1,sz,q[i].k);printf("%d\n",vec[ans-1]);}}return 0;
}

1901: Zju2112 Dynamic Rankings

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 9085  Solved: 3802
[Submit][Status][Discuss]

Description

给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1
],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改
变后的a继续回答上面的问题。

Input

第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。
分别表示序列的长度和指令的个数。
第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。
接下来的m行描述每条指令
每行的格式是下面两种格式中的一种。 
Q i j k 或者 C i t 
Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)
表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。
C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t
m,n≤10000

Output

对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。

Sample Input

5 3
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3

Sample Output

3
6

HINT

Source

转载于:https://www.cnblogs.com/wang9897/p/9213026.html

BZOJ1901: Zju2112 Dynamic Rankings相关推荐

  1. BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...

  2. BZOJ1901 Zju2112 Dynamic Rankings 【树状数组套主席树】

    题目 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k≤j- ...

  3. 主席树初探--BZOJ1901: Zju2112 Dynamic Rankings

    n<=10000的序列做m<=10000个操作:单点修改,查区间第k小. 所谓的主席树也就是一个值域线段树嘛..不过在这里还是%%fotile 需要做一个区间查询,由于查第k小,需要一些能 ...

  4. Zju2112 Dynamic Rankings(树状数组套可持久化权值线段树)

    Zju2112 Dynamic Rankings description solution code description 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须 ...

  5. 【BZOJ1901】Dynamic Rankings,树状数组套主席树

    Time:2016.05.09 Author:xiaoyimi 转载注明出处谢谢 传送门(权限) 题面 1901: Zju2112 Dynamic Rankings Time Limit: 10 Se ...

  6. Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 6321  Solved: 2628 [ ...

  7. bzoj 1901: Zju2112 Dynamic Rankings(离线树状数组+主席树)

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 8144  Solved: 3378 [ ...

  8. BZOJ1901:Zju2112 Dynamic Rankings——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 Description 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序 ...

  9. 【BZOJ1901】Zju2112 Dynamic Rankings

    Description 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是 ...

最新文章

  1. jsp静态化和伪静态化转载
  2. servlet——请求乱码问题解决
  3. linux——samba共享以及基础用法
  4. 微信分享时,描述内容怎么换行
  5. [Leetcode][第116 117题][JAVA][填充每个节点的下一个右侧节点指针][BFS][链表前驱节点]
  6. 冯诺依曼结构和哈佛结构02
  7. 蓝桥杯 ADV-81 算法提高 数的运算
  8. tomcat + apache组合配置
  9. 赵雅智_java 数据库编程(1)
  10. maya怎么导出abc格式_maya导入abc文件到UE4
  11. ADS1110/ADS1271
  12. Fibonacci费氏数列
  13. LinuxDNS域名解析
  14. 【Love2d从青铜到王者】第二篇:Love2d详细介绍以及官网安装
  15. 小米手机root步骤
  16. VBA打开一个EXCEL文件并在二个文件之间来回操作的代码
  17. java商城后台图片上传功能_淘淘商城图片上传功能的实现
  18. java,png,jpg,多张图片合成一个pdf,压缩图片,并且保证图片不失帧。
  19. FaceBook创始人扎克伯格称Google+是小号版Facebook
  20. 自定义一组基函数的最佳平方逼近——matlab实现

热门文章

  1. mysql show 翻页_mysql show操作
  2. java8的日期API总结(JSR310)
  3. Ubuntu LVS DR模式生产环境部署
  4. 使用Xamarin.Forms的企业应用程序模式(电子书)--访问远程数据
  5. cocos2d-x3.2对CocoStudio的支持
  6. mysql数据表最高速迁移,mysql的存储引擎为:myisam
  7. 常用的Linux关机命令!
  8. linux系统计算从1加到100之和思路风暴
  9. 通过源代码研究ASP.NET MVC中的Controller和View(三)
  10. vrrp路由协议实验