题目:Dynamic Rankings

题意:

N<=50000 M<=10000,给定一个数组A[1]~A[N],有M个操作

每个操作可以如下

Q i j t 输出 A[I]~A[J]之间第t小的数

C i t 将A[I]赋值为t

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>using namespace std;#define N 60010
#define M 10010
#define INF 1000000000char ctrl[M][3];
int cnt,n,m;
int P[M],Q[M],a[N],b[N],K[M];struct treap
{int key,wei,cnt,size,ch[2];
}T[N * 15];int tree[N << 1],nodecnt,root;void init()
{T[0].size = 0;T[0].wei = -INF;nodecnt = root = 0;
}int ID(int l,int r)
{return l + r | l != r;
}void update(int x)
{T[x].size = T[T[x].ch[0]].size + T[T[x].ch[1]].size + T[x].cnt;
}void rotate(int &x,int t)
{int y = T[x].ch[t];T[x].ch[t] = T[y].ch[!t];T[y].ch[!t] = x;update(x);update(y);x = y;
}void insert(int &x,int t)
{if (!x){x = ++ nodecnt;T[x].key = t;T[x].wei = rand();T[x].cnt = 1;T[x].ch[0] = T[x].ch[1] = 0;}else if (T[x].key == t)T[x].cnt ++;else{int k = T[x].key < t;insert(T[x].ch[k],t);if (T[x].wei < T[T[x].ch[k]].wei)rotate(x,k);}update(x);
}void erase(int &x,int t)
{if (T[x].key == t){if (T[x].cnt == 1){if (!T[x].ch[0] && !T[x].ch[1]){x = 0;return;}rotate(x,T[T[x].ch[0]].wei < T[T[x].ch[1]].wei);erase(x,t);}else T[x].cnt--;}elseerase(T[x].ch[T[x].key < t],t);update(x);
}int select(int x,int t)
{if (!x) return 0;if (T[x].key > t) return select(T[x].ch[0],t);return T[x].cnt + T[T[x].ch[0]].size + select(T[x].ch[1],t);
}void treeins(int l,int r,int i,int x)
{insert(tree[ID(l,r)],x);if (l == r) return;int m = l + r >> 1;if (i <= m) treeins(l,m,i,x);else treeins(m + 1,r,i,x);
}void treedel(int l,int r,int i,int x)
{erase(tree[ID(l,r)],x);if (l == r) return;int m = l + r >> 1;if (i <= m) treedel(l,m,i,x);else treedel(m + 1,r,i,x);
}int query(int l,int r,int x,int y,int t)
{if (l == r) return l;int m = l + r >> 1;int ans = select(tree[ID(l,m)],y) - select(tree[ID(l,m)],x);if (ans >= t) return query(l,m,x,y,t);return query(m + 1,r,x,y,t - ans);
}int main()
{int Times;scanf("%d",&Times);while (Times --){scanf("%d%d",&n,&m);memset(tree,0,sizeof tree);init();cnt = 0;for (int i = 1;i <= n;i ++)scanf("%d",&a[i]),b[++ cnt] = a[i];for (int i = 1;i <= m;i ++){scanf("%s%d%d",ctrl[i],&P[i],&Q[i]);if (ctrl[i][0] == 'Q')scanf("%d",&K[i]);elseb[++ cnt] = Q[i];}sort(b + 1,b + 1 + cnt);cnt = unique(b + 1,b + 1 + cnt) - b - 1;for (int i = 1;i <= n;i ++){a[i] = lower_bound(b + 1,b + 1 + cnt,a[i]) - b;treeins(1,cnt,a[i],i);}for(int i = 1;i <= m;i ++){if (ctrl[i][0] == 'Q'){int id = query(1,cnt,P[i] - 1,Q[i],K[i]);printf("%d\n",b[id]);}else{treedel(1,cnt,a[P[i]],P[i]);a[P[i]] = lower_bound(b + 1,b + 1 + cnt,Q[i]) - b;treeins(1,cnt,a[P[i]],P[i]);}}}return 0;
}

ZOJ2112(区间动态求第K大)相关推荐

  1. 堆实战(动态数据流求top k大元素,动态数据流求中位数)

    动态数据集合中求top k大元素 第1大,第2大 ...第k大 k是这群体里最小的所以要建立个小顶堆 只需要维护一个大小为k的小顶堆 即可当来的元素(newCome)> 堆顶元素(smallTo ...

  2. 无序数组求第k大的数 python_整数无序数组求第K大数

    import java.util.Scanner; /** * 类似与求第k小的问题 * 求第k大相当于求第n-k+1小,n为数组长度 * * 著名的BFPRT算法可保证在线性时间内得到结果. * h ...

  3. 树状数组与离散化与求第K大模板

    树状数组模板: //Cnt为数组的界 //cnt[i]为编号或者数值上小于id的数量 void Update(LL Id) {while(Id<=Cnt){cnt[Id]++;Id+=lowbi ...

  4. 两个排序数组中求第k大的sum(a+b)

    两个数组A,B. 是排好序的,a是A中的元素,b是B中的元素,求第k大的sum(a+b) 先把a[1]+b[1]放入堆中, 每次从堆中取得最小值,设a[i]+b[j],并扩展a[i+1]+b[j] , ...

  5. 单峰数组求第k大算法

    单峰数组实际上可以看成两个有序的数组,这个问题就转变成了两个有序数组求第k大. 容易想到的算法是对这两个数组进行归并,生成一个新的有序数组,求出第k大之后就可以立刻停止,复杂度是O(k)的. 但是还有 ...

  6. 算法题 求第K大的数

    题目描述:在乱序数组中求第K大的数 思路:立刻想到的是当然先排序然后取数.但是提问者明显不是想这么解.上网查了下原来是快排思路. 利用快排的思想,从数组arr中随机找出一个元素X,把数组分成两部分ar ...

  7. HDU 6058 Kanade's sum 逆序求第k大

    传送门:HTTP://acm.hdu.edu.cn/showproblem.php PID = 6058 题意:给你一个1-n的排列求所有自子区间的第K大的和 思路:从大到小插入位置维护当前数位置以及 ...

  8. 利用向量叉积求三角形的面积(+STL:nth_element求第K大的数)

    牛客寒假算法集训营2 https://ac.nowcoder.com/acm/contest/327/A A.处女座的签到题 题目描述 平面上有n个点,问:平面上所有三角形面积第k大的三角形的面积是多 ...

  9. 【HDU - 4006】The kth great number (优先队列,求第k大的数)

    题干: Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose to wri ...

最新文章

  1. 陈程杰、夏瑞:数据分析工具TBtools介绍和操作视频+公众号/社群
  2. Linux 下 hosts 应用
  3. [JVM-1]Java运行时数据区域
  4. 【深度学习】Dropout与学习率衰减
  5. 配置phoenix连接hbase_Phoenix4.14不读取hbase配置文件-问答-阿里云开发者社区-阿里云...
  6. Python入门100题 | 第034题
  7. java 通信层_Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务
  8. PCL:描述三维离散点的ROPS特征(Code)
  9. 论文浅尝 - CVPR2020 | 基于网格特征的可视问答系统
  10. Git -- 搭建git服务器
  11. 安装MATLAB R2012B遇到问题(需要继续安装以下一个或多个产品: MATLAB 8.0 (不可用) 您必须选择已至少安装这些),已决解!...
  12. Python之面向对象进阶篇
  13. IDM最新版软件的安装下载和使用方法
  14. CI框架解决jsonp跨域的问题
  15. 【Android】关于Call requires API level **(current min is **)却没有错误提示及抛异常...
  16. 启动系统时弹窗“Cannot load resource dll:REPLRES.RLL”弹窗问题解决
  17. 从0到1玩转戴尔G7 7588 macOS Win 双系统
  18. 物联网技术与应用期末大作业
  19. gpedit.msc打开策略组为空
  20. 搭建静态/动态网站的流程

热门文章

  1. 使用Ehcache+Redis实现分布式缓存
  2. RaDirect交换器-搭建环境
  3. 尚硅谷-SpringBoot高级-检索-Elasticsearch快速入门
  4. dns服务器zones文件,DNS服务安装与配置
  5. 【图文详解】Mysql8.0安装教程
  6. Linux 内核链表剖析(二十)
  7. 异步社区本周半价电子书(6月11-17日)
  8. 韩国研制出世界最薄光伏电池:厚度仅为人类头发直径百分之一
  9. 在Scrollview中使用AutoLayout
  10. 什么是空间复杂度(What is actually Space Complexity ?)