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的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
随机推荐
- 认识webservice
1.为什么需要webservice? 目前还有很多商用程序继续在使用C++.Java.Visual Basic和其他各种各样的语言编写.现在,除了最简单的程序之外,所有的应用程序都需要与运行在其他异构 ...
- maven 报的一堆错
今天初学maven,刚开始下载的是Apache-maven-3.6.2然后配置运行一个servlet,但是在pom.xml中写jar包坐标时一直报错显示红色,本地仓库和官网上的中央仓库都试过了就是依赖 ...
- ip访问本机vs调试项目
环境:win10 vs2019 webapi F5启动调试. 问题:localhost可以访问,127.0.0.1和本机ip访问不了.比如想让别人浏览一下看效果,或者测试人员测试功能,每次修改都有重新 ...
- kubernets之向外部应用暴露应用
一 通过NodePort来暴露服务 前面已经介绍的服务的一些作用,例如将集群内部的应用暴露给集群内部的pod使用,将外部的应用通过服务暴露给内部应用使用,但是服务最大的作用不仅仅是这些 而是将集群内 ...
- ctfhub技能树—sql注入—时间盲注
打开靶机 查看页面信息 测试时间盲注 可以看到在执行命令后会有一定时间的等待,确定为时间盲注 直接上脚本 1 #! /usr/bin/env python 2 # _*_ coding:utf-8 _ ...
- jackson学习之一:基本信息
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 【1w字+干货】第一篇,基础:让你的 Redis 不再只是安装吃灰到卸载(Linux环境)
Redis 基础以及进阶的两篇已经全部更新好了,为了字数限制以及阅读方便,分成两篇发布. 本篇主要内容为:NoSQL 引入 Redis ,以及在 Linux7 环境下的安装,配置,以及总结了非常详细的 ...
- linux登陆欢迎信息及命令提示符修改
登录信息修改 登陆信息显示数据 : /etc/issue and /etc/motd 登陆终端机的时候,会有几行提示的字符串,这些设置在/etc/issue里面可以修改,提示内容在/etc/motd中 ...
- JavaFx ObservableList的使用详解
原文地址:JavaFx ObservableList的使用详解 | Stars-One的杂货小窝 最近在研究MVVM模式,发现可以将之前写的FxRecyclerView控件改造一下,便是开始尝试,尝试 ...
- Frame of Reference and Roaring Bitmaps
https://www.elastic.co/cn/blog/frame-of-reference-and-roaring-bitmaps http://roaringbitmap.org/ 2015 ...