\(\text{Problem}\)

动态区间第 \(k\) 小

Dynamic Rankings

\(\text{Analysis}\)

整体二分

原本一个询问可二分,但多个询问效率太低

考虑离线,把修改和询问扔到一起

二分答案,运用树状数组之类的东西处理完修改操作

依次检查询问,划分左右,初步确定每个询问的答案值域,修改操作相应地划分到有必要的一边(左右)

\(\text{Code}\)

#include<cstdio>
using namespace std; const int N = 1e5 + 5;
int n, m, cnt, a[N], ans[N], T[N]; struct node{
int ty, l, r, k, id;
}q[N * 3], q1[N * 3], q2[N * 3]; inline void read(int &x)
{
x = 0; char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
} inline int lowbit(int x){return x & (-x);}
inline void add(int x, int v){for(; x <= n; x += lowbit(x)) T[x] += v;}
inline int query(int x)
{
int ret = 0;
for(; x; x -= lowbit(x)) ret += T[x];
return ret;
} void solve(int l, int r, int ql, int qr)
{
if (ql > qr) return;
if (l == r)
{
for(int i = ql; i <= qr; i++) ans[q[i].id] = l;
return;
}
int ct1 = 0, ct2 = 0, mid = (l + r) >> 1;
for(int i = ql; i <= qr; i++)
{
if (q[i].ty == 1)
{
if (q[i].l <= mid) add(q[i].r, q[i].k), q1[++ct1] = q[i];
else q2[++ct2] = q[i];
}
else{
int sum = query(q[i].r) - query(q[i].l - 1);
if (sum >= q[i].k) q1[++ct1] = q[i];
else q[i].k -= sum, q2[++ct2] = q[i];
}
}
for(int i = 1; i <= ct1; i++)
if (q1[i].ty == 1) add(q1[i].r, -q1[i].k);
for(int i = 1; i <= ct1; i++) q[ql + i - 1] = q1[i];
for(int i = 1; i <= ct2; i++) q[ql + ct1 + i - 1] = q2[i];
solve(l, mid, ql, ql + ct1 - 1);
solve(mid + 1, r, ql + ct1, qr);
} int main()
{
read(n), read(m);
for(int i = 1; i <= n; i++) read(a[i]), q[++cnt] = node{1, a[i], i, 1};
char op[3];
for(int i = 1, l, r, k; i <= m; i++)
{
scanf("%s", op), read(l), read(r);
if (op[0] == 'C') q[++cnt] = node{1, a[l], l, -1}, q[++cnt] = node{1, a[l] = r, l, 1};
else read(k), q[++cnt] = node{2, l, r, k, i};
}
solve(0, 1e9, 1, cnt);
for(int i = 1; i <= m; i++)
if (ans[i]) printf("%d\n", ans[i]);
}

当然可以树状数组套权值线段树

\(\text{Code}\)

#include <cstdio>
#include <algorithm>
#include <iostream>
#define re register
using namespace std; const int N = 1e5 + 5;
int n, m, len, a[N], b[N * 2], ct1, ct2, tmp1[50], tmp2[50];
struct que{int o, l, r, k;}q[N]; inline void read(int &x)
{
x = 0; char ch = getchar();
while (!isdigit(ch)) ch = getchar();
while (isdigit(ch)) x = (x<<3)+(x<<1)+(ch^48), ch = getchar();
} int size, rt[N], sum[N * 400], ls[N * 400], rs[N * 400];
void modify(int &p, int l, int r, int x, int v)
{
if (!p) p = ++size;
sum[p] += v;
if (l == r) return;
int mid = (l + r) >> 1;
if (x <= mid) modify(ls[p], l, mid, x, v);
else modify(rs[p], mid + 1, r, x, v);
}
int query(int l, int r, int k)
{
if (l == r) return l;
int s = 0, mid = (l + r) >> 1;
for(re int i = 1; i <= ct1; i++) s += sum[ls[tmp1[i]]];
for(re int i = 1; i <= ct2; i++) s -= sum[ls[tmp2[i]]];
if (k <= s)
{
for(re int i = 1; i <= ct1; i++) tmp1[i] = ls[tmp1[i]];
for(re int i = 1; i <= ct2; i++) tmp2[i] = ls[tmp2[i]];
return query(l, mid, k);
}
else{
for(re int i = 1; i <= ct1; i++) tmp1[i] = rs[tmp1[i]];
for(re int i = 1; i <= ct2; i++) tmp2[i] = rs[tmp2[i]];
return query(mid + 1, r, k - s);
}
} inline int lowbit(int x){return x & (-x);}
inline void Modify(int x, int val, int v)
{
val = lower_bound(b + 1, b + len + 1, val) - b;
for(; x <= n; x += lowbit(x)) modify(rt[x], 1, len, val, v);
}
inline int Query(int l, int r, int k)
{
ct1 = ct2 = 0;
for(; r; r -= lowbit(r)) tmp1[++ct1] = rt[r];
for(l = l - 1; l; l -= lowbit(l)) tmp2[++ct2] = rt[l];
return b[query(1, len, k)];
} int main()
{
read(n), read(m);
for(re int i = 1; i <= n; i++) read(a[i]), b[++len] = a[i];
int l, r, k; char op[3];
for(re int i = 1; i <= m; i++)
{
scanf("%s", op), read(l), read(r);
if (op[0] == 'Q') read(k), q[i] = que{1, l, r, k};
else q[i] = que{0, l, r}, b[++len] = r;
}
sort(b + 1, b + len + 1);
len = unique(b + 1, b + len + 1) - b - 1;
for(re int i = 1; i <= n; i++) Modify(i, a[i], 1);
for(re int i = 1; i <= m; i++)
if (q[i].o == 1) printf("%d\n", Query(q[i].l, q[i].r, q[i].k));
else Modify(q[i].l, a[q[i].l], -1), Modify(q[i].l, a[q[i].l] = q[i].r, 1);
}

LG P2617 Dynamic Rankings的更多相关文章

  1. P2617 Dynamic Rankings(树状数组套主席树)

    P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...

  2. 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)

    P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...

  3. 洛谷P2617 Dynamic Rankings (主席树)

    洛谷P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a ...

  4. 洛谷 P2617 Dynamic Rankings 解题报告

    P2617 Dynamic Rankings 题目描述 给定一个含有\(n\)个数的序列\(a[1],a[2],a[3],\dots,a[n]\),程序必须回答这样的询问:对于给定的\(i,j,k\) ...

  5. 【学习笔鸡】整体二分(P2617 Dynamic Rankings)

    [学习笔鸡]整体二分(P2617 Dynamic Rankings) 可以解决一些需要树套树才能解决的问题,但要求询问可以离线. 首先要找到一个具有可二分性的东西,比如区间\(k\)大,就很具有二分性 ...

  6. luogu P2617 Dynamic Rankings && bzoj 1901 (带修改区间第k大)

    链接:https://www.luogu.org/problemnew/show/P2617 思路: 如果直接在主席树上修改的话,每次修改都会对后面所有的树造成影响,一次修改的复杂度就会变成 : n* ...

  7. P2617 Dynamic Rankings(待修改区间第k大)

    题目链接:https://www.luogu.org/problemnew/show/P2617 题目: 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的 ...

  8. 洛谷P2617 Dynamic Rankings

    带修主席树模板题 主席树的单点修改就是把前缀和(大概)的形式改成用树状数组维护,每个树状数组的元素都套了一个主席树(相当于每个数组的元素root[i]都是主席树,且这个主席树维护了(i - lowbi ...

  9. Luogu P2617 Dynamic Rankings

    带修主席树的模板,因为状态不好所以敲了很长时间,不过写完感觉能更好地理解主席树了. 核心其实就是树状数组套主席树,维护方法不再是以前的那种一步一修改,而是对于树状数组上的每一个点建立一棵权值线段树,然 ...

  10. P2617 Dynamic Rankings(带修主席树)

    所谓带修主席树,就是用树状数组的方法维护主席树的前缀和 思路 带修主席树的板子 注意数据范围显然要离散化即可 代码 #include <cstdio> #include <cstri ...

随机推荐

  1. Oracle 一对多将多行数据整理为一行

    在开发中一对多的关系经常用到,昨天遇到一个客户问题,要求将所有反馈任务的信息整理为一行展示并导出excel. 我数据库对应关系:通任务task对应feedback表多个反馈,也就是说每个任务都有很多条 ...

  2. day27 CSS浮动、溢出 & js基本语法 & DOM文档流操作

    接day26CSS=>CSS定位 overflow属性 值 描述 示例 visible 默认值,内容不会被修剪,会呈现在元素框之外 hidden 内容会被修剪,并且其余内容是不可见的 overf ...

  3. Shell及Linux常见易错题目题库-Shell/Linux-选择、简答、判断、编程

    1.以下不合法的shell头是(不合法指运行会报错)(   ) A. #!/bin/bash B. #-/bin/bash C. !#/bin/bash 答案:C 2.if [ $2 -a $2 = ...

  4. labuladong算法笔记总结

    动态规划解题套路框架 学习计划: 最长回文子序列 〇.必读文章 1.数据结构和算法学习指南(学习算法和刷题的框架思维) 了解数据结构的操作和遍历(迭代or递归) 从树刷起,结合框架思维,有利于理解(回 ...

  5. MongoDB海量数据分页查询优化

    MongoDB海量数据分页查询优化 一.背景 大量数据需从Mongo拿出来,一次性拿出来不科学,传统分页效率低下 二.传统方案 就是最常规的方案,假设 我们需要对文章 articles 这个表(集合) ...

  6. Django三大主流Web框架(django版本安装-项目创建-应用创建-django三板斧)

    目录 一:python三大主流web框架 1.python三大主流Web框架 2:三大主流web框架特点 二:正常运行Django项目所需要知道的注意事项 1.计算机的名称不能有中文,不然bug在哪你 ...

  7. 一文聊透Apache Hudi的索引设计与应用

    Hudi索引在数据读和写的过程中都有应用.读的过程主要是查询引擎利用MetaDataTable使用索引进行Data Skipping以提高查找速度;写的过程主要应用在upsert写上,即利用索引查找该 ...

  8. Prometheus高可用架构介绍

    Prometheus作为新生代的开源监控系统,慢慢成为了云原生体系的监控事实标准,也证明了其设计得到业界认可.但在多集群,大集群等场景下,Prometheus由于没有分片能力和多集群支持,还有Prom ...

  9. 简单易用的监控告警系统 | HertzBeat 在 Rainbond 上的使用分享

    在现有的监控告警体系中 Prometheus + AlertManger + Grafana 一直是主流,但对于中小团队或个人来说,这种体系显的较为复杂.而 HertzBeat 能让中小团队或个人很快 ...

  10. [python]《Python编程快速上手:让繁琐工作自动化》学习笔记5

    1. 处理CSV文件笔记(第14章) (代码下载) 本文主要在python下介绍CSV文件,CSV 表示"Comma-Separated Values(逗号分隔的值)",CSV文件 ...