静态区间第K小(整体二分、主席树)
题目链接
题解
主席树入门题
但是这里给出整体二分解法
整体二分顾名思义是把所有操作放在一起二分
想想,如果求\([1-n]\)的第\(k\)小怎么二分求得?
我们可以二分答案\(k\), \(O(n)\)统计有多少个数小于等于\(k\)
如果对于每个询问都这么搞,肯定不行
我们可以发现,如果每次都搞一次,有许多算重复的地方
\(div(l, r, st, ed)\)表示\(k\)二分的区间\([l-r]\), 对应操作答案区间在\([st-ed]\)
(如果没看懂,先往下看。)
\(mid = (l+r)/2\)
对于每次的\(mid\), 我们把对\(k\)往左移还有贡献的 放在一起, 右移的放在一起,这样答案就在一个区间内
那么如何统计一段区间有多少个数比\(k\)大呢?
我们开一个树状数组,如果\(x\)位上的数大于\(k\),那么给\(x\)加上1
然后统计就是区间求和了
Code
#include<bits/stdc++.h>
#define LL long long
#define RG register
using namespace std;
const int N = 200010, INF = 1e9;
struct rec {
int op, x, y, z;
}q[N<<1], lq[N<<1], rq[N<<1];
int n, m, tot, c[N], ans[N];
#define lowbit(x) (x&(-x))
void add(int x, int v) {
while (x <= n) c[x] += v, x += lowbit(x);
return ;
}
int sum(int x) {
int res = 0;
while (x > 0) res += c[x], x -= lowbit(x);
return res;
}
int X[N], cnt;
inline int gi() {
RG int x = 0; RG char c = getchar(); bool f = 0;
while (c != '-' && (c < '0' || c > '9')) c = getchar();
if (c == '-') c = getchar(), f = 1;
while (c >= '0' && c <= '9') x = x*10+c-'0', c = getchar();
return f ? -x : x;
}
void div(int l, int r, int st, int ed) {
if (st > ed) return ;//[l~r]中没有答案
if (l == r) {
for (int i = st; i <= ed; i++)
if (q[i].op) ans[q[i].op] = l;//记录答案
return ;
}
int mid = (l + r) >> 1;
int lt = 0, rt = 0;
for (int i = st; i <= ed; i++) {
if (!q[i].op) {
if (q[i].y <= mid) add(q[i].x, 1), lq[++lt] = q[i];//k如果往左移,修改操作还有影响
else rq[++rt] = q[i];
}
else {
int res = sum(q[i].y) - sum(q[i].x-1);
if (res >= q[i].z) lq[++lt] = q[i];//已经满足至少第K大了,K还可以调小
else q[i].z -= res, /*把所有q[i].y<=mid的贡献减去,调大k时就不需要统计这些的贡献了*/rq[++rt] = q[i];
}
}
for (int i = st; i <= ed; i++)
if (!q[i].op && q[i].y <= mid) add(q[i].x, -1);//清除
for (int i = 1; i <= lt; i++) q[st+i-1] = lq[i];
for (int i = 1; i <= rt; i++) q[st+lt+i-1] = rq[i];
div(l, mid, st, st+lt-1);
div(mid+1, r, st+lt, ed);
return ;
}
int main() {
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
n = gi(); m = gi();
for (int i = 1; i <= n; i++) {
q[++tot].op = 0, q[tot].x = i, X[++cnt] = q[tot].y = gi();
}
sort(X+1, X+1+cnt); cnt = unique(X+1, X+cnt+1)-X-1;//离散化
for (int i = 1; i <= n; i++)
q[i].y = lower_bound(X+1, X+cnt+1, q[i].y)-X;
for (int i = 1; i <= m; i++) {
q[++tot].op = i; q[tot].x = gi();q[tot].y = gi();q[tot].z = gi();
}
div(1, n, 1, tot);
for (int i = 1; i <= m; i++)
printf("%d\n", X[ans[i]]);
return 0;
}
静态区间第K小(整体二分、主席树)的更多相关文章
- 静态区间第k小 - 整体二分
蒟蒻终于学会整体二分啦! 思路 实现 丑陋无比的代码 #include <bits/stdc++.h> using namespace std; const int N = 200005; ...
- 【XSY2720】区间第k小 整体二分 可持久化线段树
题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n ...
- POJ2104 K-th Number —— 区间第k小 整体二分
题目链接:https://vjudge.net/problem/POJ-2104 K-th Number Time Limit: 20000MS Memory Limit: 65536K Tota ...
- Dynamic Rankings || 动态/静态区间第k小(主席树)
JYF大佬说,一星期要写很多篇博客才会有人看 但是我做题没有那么快啊QwQ Part1 写在前面 区间第K小问题一直是主席树经典题=w=今天的重点是动态区间第K小问题.静态问题要求查询一个区间内的第k ...
- 51nod 1175 区间第k大 整体二分
题意: 一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,第K大的数是多少. 分析: 仅仅就是一道整体二分的入门题而已,没听说过整体二分? 其实就是一个分治的函数 ...
- [xdoj1216]子树第k小(dfs序+主席树)
解题关键:dfs序将树映射到区间,然后主席树求区间第k小,为模板题. #pragma comment(linker, "/STACK:1024000000,1024000000") ...
- 区间第K小——可持久化线段树模板
概念 可持久化线段树又叫主席树,之所以叫主席树是因为这东西是fotile主席创建出来的. 可持久化数据结构思想,就是保留整个操作的历史,即,对一个线段树进行操作之后,保留访问操作前的线段树的能力. 最 ...
- [luogu3834]静态区间第k小【主席树】
传送门:https://www.luogu.org/problemnew/show/P3834 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 分析 很多人都说是用 ...
- 主席树(可持久化线段树)静态区间第K小
传送门主席树 #include <bits/stdc++.h> #define int long long using namespace std; const int maxn=2e5+ ...
随机推荐
- mask rcnn训练自己的数据集参考文章(推荐)
最近用Mask_RCNN训练模型,下面几篇文章提供了不少帮助,汇总出来,方便以后查找,并向几位博主老师表示感谢 https://blog.csdn.net/qq_29462849/article/de ...
- Python 安装urllib3
一.系统环境 操作系统:Win10 64位 Python版本:Python 3.7.0 二.报错信息 No module named 'urllib3' 三.安装参考 1.参照网上的安装方法通过pip ...
- ubunt 14.04 Could not find CMAKE_ROOT !!! CMake has most likely not been installed correctly. Modul
CMake Error: Could not find CMAKE_ROOT !!! CMake has most likely not been installed correctly. Modul ...
- Django--admin后台
需求 通过后台和models操作数据库表 实现 1.后台中看到数据库中的表 app01/admin.py 1 2 from app01 import models admin.site.regist ...
- jQuery--全选、反选、取消
主要知识点: prop()--主要检查和设置checked attr()是针对所有属性,prop()是针对checked和selected等单一存在的,判断他们的true或者false. find() ...
- caret 分类回归树 用法
http://topepo.github.io/caret/feature-selection-overview.html
- ShopNc登录
- activex打包
http://www.cnblogs.com/weiwin/p/4493835.html activeX 打包 原文 http://www.docin.com/p-409284488.html C ...
- Servlet中response对象Commit状态的分析
response是服务端对客户端请求的一个响应,其中封装了响应头.状态码.内容(也就是最终要在浏览器上显示的HTML代码或者其他数据格式)等. 服务端在把response提交到客户端之前,会使用一个缓 ...
- 对C#泛型讲的很好的一篇文章
请参考 https://www.cnblogs.com/kissdodog/archive/2013/01/27/2879185.html