P2617 Dynamic Rankings (动态开点权值线段树 + 树状数组)
题意:带修求区间k小
题解:回忆在使用主席树求区间k小时 利用前缀和的思想 既然是前缀和 那么我们可以使用更擅长维护前缀和的树状数组
但是这里每一颗权值线段树就不是带版本的 而是维护数组里i号点的权值信息 所以实际上并不是主席树 每一棵和前面一棵并没有共用结点
对于一次修改操作 我们先删去这个点的原信息 再更新进去 树状数组上的点一起跳 可能看代码比较好理解一点
这个方法限制性也很强 必须离线
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 2; int n, m, len, cnt;
int a[100005];
int b[200005];
int sum[MAXN * 400];
int ls[MAXN * 400];
int rs[MAXN * 400];
int t[MAXN];
int temp[2][50];
int tot1, tot0; struct node {
char opt;
int u, v, w;
}E[100005]; void add(int &o, int l, int r, int k, int v) {
if(!o) o = ++cnt;
sum[o] += v;
int mid = l + r >> 1;
if(l == r) return; if(k <= mid) add(ls[o], l, mid, k, v);
else add(rs[o], mid + 1, r, k, v);
} void update(int x, int pos, int v) {
for(int i = x; i <= n; i += (i & -i)) add(t[i], 1, len, pos, v);
} void prepare_query(int l, int r) {
tot1 = tot0 = 0;
for(int i = r; i >= 1; i -= (i & -i)) temp[1][++tot1] = t[i];
for(int i = l; i >= 1; i -= (i & -i)) temp[0][++tot0] = t[i];
} int query(int l, int r, int k) {
if(l == r) return l; int mid = l + r >> 1;
int res = 0;
for(int i = 1; i <= tot1; i++) res += sum[ls[temp[1][i]]];
for(int i = 1; i <= tot0; i++) res -= sum[ls[temp[0][i]]];
if(res >= k) {
for(int i = 1; i <= tot1; i++) temp[1][i] = ls[temp[1][i]];
for(int i = 1; i <= tot0; i++) temp[0][i] = ls[temp[0][i]];
return query(l, mid, k);
} else {
for(int i = 1; i <= tot1; i++) temp[1][i] = rs[temp[1][i]];
for(int i = 1; i <= tot0; i++) temp[0][i] = rs[temp[0][i]];
return query(mid + 1, r, k - res);
}
} char s[5];
int main() {
cnt = 0;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i];
len = n; for(int i = 1; i <= m; i++) {
scanf("%s", s);
E[i].opt = s[0];
if(E[i].opt == 'Q') scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].w);
else {
scanf("%d%d", &E[i].u, &E[i].v);
b[++len] = E[i].v;
}
}
sort(b + 1, b + 1 + len);
len = unique(b + 1, b + 1 + len) - b - 1; for(int i = 1; i <= n; i++) {
int tt = lower_bound(b + 1, b + 1 + len, a[i]) - b;
update(i, tt, 1);
} for(int i = 1; i <= m; i++) {
if(E[i].opt == 'Q') {
prepare_query(E[i].u - 1, E[i].v);
printf("%d\n", b[query(1, len, E[i].w)]);
} else {
int t1 = lower_bound(b + 1, b + 1 + len, a[E[i].u]) - b;
update(E[i].u, t1, -1);
a[E[i].u] = E[i].v;
int t2 = lower_bound(b + 1, b + 1 + len, a[E[i].u]) - b;
update(E[i].u, t2, 1);
}
}
return 0;
}
P2617 Dynamic Rankings (动态开点权值线段树 + 树状数组)的更多相关文章
- [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)
Description “我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力.”——<The Grimoire of Marisa>雾雨魔理 ...
- HDU 6464.免费送气球-动态开点-权值线段树(序列中第first小至第second小的数值之和)(感觉就是只有一个状态的主席树) (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)
免费送气球 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- P2617 Dynamic Rankings 动态主席树
\(\color{#0066ff}{ 题目描述 }\) 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...
- Luogu P2617 Dynamic Rankings(整体二分)
题目 动态区间第K小模板题. 一个非常可行的办法是BIT套动态开点权值SegTree,但是它跑的实在太慢了. 然后由于这题并没有强制在线,所以我们可以使用整体二分来吊打树套树. 当然如果强制在线的话就 ...
- [luogu P2617] Dynamic Rankings 带修主席树
带修改的主席树,其实这种,已经不能算作主席树了,因为这个没有维护可持久化的... 主席树直接带修改的话,由于这种数据结构是可持久化的,那么要相应改动,这个节点以后所有的主席树,这样单次修改,就达到n* ...
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
- Dynamic Rankings(树状数组套权值线段树)
Dynamic Rankings(树状数组套权值线段树) 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[ ...
- luogu3224 永无乡(动态开点,权值线段树合并)
luogu3224 永无乡(动态开点,权值线段树合并) 永无乡包含 n 座岛,编号从 1 到 n ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 n 座岛排名,名次用 1 到 n 来表示.某些 ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
随机推荐
- uber_go_guide解析(一)
前言 实力有限,guide啃着好费劲 原地址https://github.com/xxjwxc/uber_go_guide_cn 加我自己的体会和补充 基于Golang 1.14 正文 Interfa ...
- [RTMP] 国内各大视频直播CDN厂商推流抢流行为分析
背景 当存在一个推流客户端正在向rtmp://xxx.com/live/yyy推流时,又有另外一个推流客户端同时对这个地址进行推流,会发生什么呢? 查阅了 Adobe RTMP Spec 发现规范本身 ...
- 【JavaWeb】Servlet 程序
Servlet 程序 Servlet Servlet 是在 Web 服务器中运行的小型 Java 程序.Servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求. ...
- TypeScript接口与类的使用
一.TypeScript接口 Interfaces 可以约定一个对象的结构 一个对象去实现一个接口 就必须拥有这个接口中所有的成员用interface定义接口, 并且定义接口中成员的类型 编译之后会发 ...
- vim 手动添加脚本头部信息
vim /root/.vimrc 8,1 全部 set autoindent set tabstop=5 set shiftwidth=4 function AddTitle() call setli ...
- CICD基础概念
windows下搭建jenkins:安装方法一:1.安装JDK,配置好环境变量2.下载安装最新版本Jenkins:登陆 http://mirrors.jenkins-ci.org/ 下载windows ...
- Java 多线程读取文件并统计词频 实例 出神入化的《ThreadPoolExecutor》
重在展示多线程ThreadPoolExecutor的使用,和线程同步器CountDownLatch,以及相关CAS的原子操作和线程安全的Map/队列. ThreadPool主线程 1 import j ...
- kubernets与API服务器进行交互
一 为何需要与kubernets集群的API服务器进行交互 1.1 kubernets提供了一种downapi的资源可以将pod的元数据渲染成环境变量或者downward卷的形式挂载到容器的文件系 ...
- linux DRM GPU scheduler 笔记
内核文档: Overview The GPU scheduler provides entities which allow userspace to push jobs into softw ...
- Java 迭代器的使用 Iterator
Java的集合类可以使用for ... each循环 List Set Queue Deque 我们以List为例 其实一个java编译器并不知道如何遍历一个List 编译器只是把一个for ... ...