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继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令。对于每一个询问指令,你必须输出正确的回答。 第一行有两个正整数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。

Input

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

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

20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。

Source

依旧是模板,树状数组套主席树比较神奇,每个树状数组做一颗主席树,感觉树状数组学得不好啊。。。将时间提高到了nlog2n,注意离线的写法。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 using namespace std;
  5 int sum[2500010],ls[2500010],rs[2500010],root[10010],A[10010],B[10010],C[10010],num[20010],hash[20010],v[10010],L[30],R[30],flag[10010];
  6 int n,m,nt,numt,sz,a,b;
  7 int lowbit(int x){return x&(-x);}
  8
  9 int find(int x)
 10 {
 11     int l=1,r=nt,mid;
 12     while (l<=r)
 13     {
 14         mid=(l+r)>>1;
 15         if (hash[mid]<x)    l=mid+1;
 16         else    r=mid-1;
 17     }
 18     return l;
 19 }
 20
 21 void updata(int l,int r,int x,int &y,int p,int w)
 22 {
 23     y=++sz;
 24     sum[y]=sum[x]+w;
 25     ls[y]=ls[x]; rs[y]=rs[x];
 26     if (l==r)    return;
 27     int mid=(l+r)>>1;
 28     if (p<=mid) updata(l,mid,ls[x],ls[y],p,w);
 29     else    updata(mid+1,r,rs[x],rs[y],p,w);
 30 }
 31
 32 int query(int l,int r,int k)
 33 {
 34     if (l==r)    return l;
 35     int suml=0,sumr=0;
 36     for (int i=1;i<=a;i++)    suml+=sum[ls[L[i]]];
 37     for (int i=1;i<=b;i++)    sumr+=sum[ls[R[i]]];
 38     int mid=(l+r)>>1;
 39     if (sumr-suml>=k)
 40     {
 41         for (int i=1;i<=a;i++)    L[i]=ls[L[i]];
 42         for (int i=1;i<=b;i++)    R[i]=ls[R[i]];
 43         return query(l,mid,k);
 44     }
 45     else
 46     {
 47         for (int i=1;i<=a;i++)    L[i]=rs[L[i]];
 48         for (int i=1;i<=b;i++)    R[i]=rs[R[i]];
 49         return query(mid+1,r,k-(sumr-suml));
 50     }
 51 }
 52
 53 int main()
 54 {
 55     scanf("%d%d",&n,&m);
 56     for (int i=1;i<=n;i++)
 57     {
 58         scanf("%d",&v[i]);
 59         num[++numt]=v[i];
 60     }
 61     for (int i=1;i<=m;i++)
 62     {
 63         char s[6];
 64         scanf("%s",s);
 65         scanf("%d%d",&A[i],&B[i]);
 66         if (s[0]=='Q')    {scanf("%d",&C[i]);flag[i]=1;}
 67         else    num[++numt]=B[i];
 68     }
 69     sort(num+1,num+numt+1);
 70     hash[++nt]=num[1];
 71     for (int i=2;i<=numt;i++)
 72         if (num[i]!=num[i-1])
 73             hash[++nt]=num[i];
 74     for (int i=1;i<=n;i++)
 75     {
 76         int t=find(v[i]);
 77         for (int j=i;j<=n;j+=lowbit(j))    updata(1,nt,root[j],root[j],t,1);
 78     }
 79     for (int i=1;i<=m;i++)
 80     {
 81         if (flag[i])
 82         {
 83             a=0,b=0;
 84             int xx;
 85             A[i]--;
 86             for (int j=A[i];j>=1;j-=lowbit(j))    L[++a]=root[j];
 87             for (int j=B[i];j>=1;j-=lowbit(j))    R[++b]=root[j];
 88             xx=query(1,nt,C[i]);
 89             printf("%d\n",hash[xx]);
 90         }
 91         else
 92         {
 93             int t=find(v[A[i]]);
 94             for (int j=A[i];j<=n;j+=lowbit(j)) updata(1,nt,root[j],root[j],t,-1);
 95             v[A[i]]=B[i];
 96             t=find(B[i]);
 97             for (int j=A[i];j<=n;j+=lowbit(j)) updata(1,nt,root[j],root[j],t,1);
 98         }
 99     }
100     return 0;
101 }

View Code

转载于:https://www.cnblogs.com/DMoon/p/5236277.html

【BZOJ1901】Zju2112 Dynamic Rankings相关推荐

  1. BZOJ1901:Zju2112 Dynamic Rankings——题解

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

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

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

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

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

  4. BZOJ1901: Zju2112 Dynamic Rankings

    题解:很显然的树套树 主席树+树状数组 动态维护区间权值 然后类似于查询区间第K大 复杂度nlog^2n 空间也如此 #include <bits/stdc++.h> const int ...

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

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

  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 【树状数组套主席树】

    题目 给定一个含有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- ...

  9. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

最新文章

  1. Codeforces 611D New Year and Ancient Prophecy DP
  2. java程序结构_Java 程序结构说明(学习 Java 编程语言 004)
  3. 全选文字的快捷键_高效办公必备Excel快捷键之Ctrl+26个字母!掌握它们,告别加班...
  4. 从C#开始的面向对象编程经典自学教程
  5. 多选取值_机制砂如何控制MB值和石粉含量
  6. 产品经理如何做好信息架构
  7. r语言plot函数设置y轴的范围及刻度_R语言之简单绘图
  8. python模拟登录获取Cookie
  9. ipad python编程软件_在iPad中运行Python
  10. 使用计算机对炼钢过程,炼钢过程计算机二级系统
  11. oracle导出导入同义词,oracle同义词语句备份
  12. QT 自定义类访问UI控件的几种方法
  13. 论文复现——CE-FPN: Enhancing Channel Information for Object Detection
  14. linux幸运字符,删好友后幸运字符怎么找回来
  15. Xtool X100 PAD2 Error Code 5 Data Not Exist Solution
  16. 程序员的真实工资是多少?
  17. tesla 显卡在ubuntu下安装显卡驱动log in loop 不能登陆的问题
  18. 苹果平板可以用html么,哪些苹果平板可以用苹果笔
  19. 使用百度地图API创建第一个电子地图
  20. 基于Python改变图片像素大小

热门文章

  1. 穷小子做网站赚钱终得丈母娘认可
  2. Android中Scrollview、ViewPager冲突问题汇总(已解决)
  3. java 垃圾回收知识点
  4. 一起学Windows Phone 7开发(九.Windows Phone Developer Tools Beta)
  5. void符合c语言用户标识吗,1以下可用作C语言用户标识符的是()。void,define,.doc...
  6. mysql char类型c 映射_使用Hibernate原生SQL映射MYSQL的CHAR(n)类型到String时出错
  7. 虚拟顺丰快递生成器_电商时代|从顺丰优选看,生鲜冷链物流发展面临的问题及解决思路...
  8. (35)FPGA面试技能提升篇(AD、DA、时钟芯片)
  9. java64 离线_Java调用人脸识别离线sdk-windows版
  10. 网段和子网的区别_石笼网袋和石笼网的区别