ZOJ2112(区间动态求第K大)
题目: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大)相关推荐
- 堆实战(动态数据流求top k大元素,动态数据流求中位数)
动态数据集合中求top k大元素 第1大,第2大 ...第k大 k是这群体里最小的所以要建立个小顶堆 只需要维护一个大小为k的小顶堆 即可当来的元素(newCome)> 堆顶元素(smallTo ...
- 无序数组求第k大的数 python_整数无序数组求第K大数
import java.util.Scanner; /** * 类似与求第k小的问题 * 求第k大相当于求第n-k+1小,n为数组长度 * * 著名的BFPRT算法可保证在线性时间内得到结果. * h ...
- 树状数组与离散化与求第K大模板
树状数组模板: //Cnt为数组的界 //cnt[i]为编号或者数值上小于id的数量 void Update(LL Id) {while(Id<=Cnt){cnt[Id]++;Id+=lowbi ...
- 两个排序数组中求第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] , ...
- 单峰数组求第k大算法
单峰数组实际上可以看成两个有序的数组,这个问题就转变成了两个有序数组求第k大. 容易想到的算法是对这两个数组进行归并,生成一个新的有序数组,求出第k大之后就可以立刻停止,复杂度是O(k)的. 但是还有 ...
- 算法题 求第K大的数
题目描述:在乱序数组中求第K大的数 思路:立刻想到的是当然先排序然后取数.但是提问者明显不是想这么解.上网查了下原来是快排思路. 利用快排的思想,从数组arr中随机找出一个元素X,把数组分成两部分ar ...
- HDU 6058 Kanade's sum 逆序求第k大
传送门:HTTP://acm.hdu.edu.cn/showproblem.php PID = 6058 题意:给你一个1-n的排列求所有自子区间的第K大的和 思路:从大到小插入位置维护当前数位置以及 ...
- 利用向量叉积求三角形的面积(+STL:nth_element求第K大的数)
牛客寒假算法集训营2 https://ac.nowcoder.com/acm/contest/327/A A.处女座的签到题 题目描述 平面上有n个点,问:平面上所有三角形面积第k大的三角形的面积是多 ...
- 【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 ...
最新文章
- 陈程杰、夏瑞:数据分析工具TBtools介绍和操作视频+公众号/社群
- Linux 下 hosts 应用
- [JVM-1]Java运行时数据区域
- 【深度学习】Dropout与学习率衰减
- 配置phoenix连接hbase_Phoenix4.14不读取hbase配置文件-问答-阿里云开发者社区-阿里云...
- Python入门100题 | 第034题
- java 通信层_Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务
- PCL:描述三维离散点的ROPS特征(Code)
- 论文浅尝 - CVPR2020 | 基于网格特征的可视问答系统
- Git -- 搭建git服务器
- 安装MATLAB R2012B遇到问题(需要继续安装以下一个或多个产品: MATLAB 8.0 (不可用) 您必须选择已至少安装这些),已决解!...
- Python之面向对象进阶篇
- IDM最新版软件的安装下载和使用方法
- CI框架解决jsonp跨域的问题
- 【Android】关于Call requires API level **(current min is **)却没有错误提示及抛异常...
- 启动系统时弹窗“Cannot load resource dll:REPLRES.RLL”弹窗问题解决
- 从0到1玩转戴尔G7 7588 macOS Win 双系统
- 物联网技术与应用期末大作业
- gpedit.msc打开策略组为空
- 搭建静态/动态网站的流程