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的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
随机推荐
- Java 双端队列接口 Deque
Deque 是一种支持在两端进行操作的线性结构,包含了栈和队列的功能.Java 中建议使用 Dqueue 的实现来替代遗留的 Stack 类.本文将介绍 Deque 提供的主要 API. 双端操作 A ...
- springboot异常处理之404
ps: 推荐一下本人的通用后台管理项目crowd-admin 以及newbee-mall增强版,喜欢的话给个star就好 源码分析 在springboot中默认有一个异常处理器接口ErrorConto ...
- 一文读懂 SuperEdge 边缘容器架构与原理
前言 superedge是腾讯推出的Kubernetes-native边缘计算管理框架.相比openyurt以及kubeedge,superedge除了具备Kubernetes零侵入以及边缘自治特性, ...
- java8新特性之stream流
Stream 流是 Java 8 提供给开发者一套新的处理集合的API,他把我们将要处理的集合作为流,就像流水线一样,我们可以对其中的元素进行筛选,过滤,排序等中间操作,只不过这种操作更加简洁高效. ...
- tensorflow安装使用过程错误及解决方法
tensorflow2.x 使用过程中常见错误(持续更新) 安装配置,使用tensorflow训练模型,转换为tflite模型,并部署与移动端过程中,虽然不难,但是也常出现一些莫名其妙的问题,下面简单 ...
- 用percona monitoring plugins 监控mysql
下载:http://www.percona.com/redir/downloads/percona-monitoring-plugins/1.1.1/percona-zabbix-templates- ...
- 使用.net中的API网关模式封装微服务
在本文中,我们将了解如何使用API网关模式来封装微服务并抽象出底层实现细节,从而允许使用者拥有进入我们系统的一致入口点. 为了构建和测试我们的应用程序,我们需要: 1.Visual Studio 20 ...
- 控制tomcat日志文件的输出到catalina.out
在catalina.sh中直接把下面的内容注释掉即可:
- centos 7.0 ping百度提示:ping: www.baidu.com: Name or service not known
解决方法一: 添加dns服务器 vi /etc/resolv.conf 在文件中添加如下两行: nameserver 8.8.8.8 nameserver 8.8.4.4 保存退出,重启服务器.之后再 ...
- 一体化的Linux系统性能和使用活动监控工具–Sysstat
[转]原文出处: Tecmint-Kuldeep Sharma 译文出处:Linux Story-天寒 欢迎分享原创到伯乐头条 在监控系统资源.系统性能和使用活动方面,Sysstat的确是一个 ...