Description

给定一个长度为 \(n\) 的序列, \(m\) 次操作静态查询区间第 \(k\) 大

Input

第一行是 \(n,m\)

下一行描述这个序列

下面 \(m\) 行描述操作

Output

每个查询输出一行一个数代表答案

Hint

\(1~\leq~n,~m~\leq~2~\times~10^5\)

值域为 \([-1e9,~1e9]\)

Solution

考虑整体二分。

将操作和序列全部离线,混在一起操作,在每层中,如果一个插入操作插入的数大于 mid,则压入右边的vector,否则压入左边的vector,这样即可保证在每一层整个序列的插入操作只被操作 \(1\) 次。用树状数组维护不大于 mid 的插入点,插入点个数不小于 \(k\) 的查询压入左侧,否则 \(k~-=~\text{压入点个数}\) ,压入右侧即可。

注意一个区间内没有操作的时候要剪枝,否则复杂度会加上值域。

总复杂度 \(O((n + m)~\log^2 m)\)

Code

// luogu-judger-enable-o2
#include <cstdio>
#include <vector>
#include <iostream>
#ifdef ONLINE_JUDGE
#define freopen(a, b, c)
#endif typedef long long int ll; namespace IPT {
const int L = 1000000;
char buf[L], *front=buf, *end=buf;
char GetChar() {
if (front == end) {
end = buf + fread(front = buf, 1, L, stdin);
if (front == end) return -1;
}
return *(front++);
}
} template <typename T>
inline void qr(T &x) {
char ch = IPT::GetChar(), lst = ' ';
while ((ch > '9') || (ch < '0')) lst = ch, ch=IPT::GetChar();
while ((ch >= '0') && (ch <= '9')) x = (x << 1) + (x << 3) + (ch ^ 48), ch = IPT::GetChar();
if (lst == '-') x = -x;
} namespace OPT {
char buf[120];
} template <typename T>
inline void qw(T x, const char aft, const bool pt) {
if (x < 0) {x = -x, putchar('-');}
int top=0;
do {OPT::buf[++top] = static_cast<char>(x % 10 + '0');} while (x /= 10);
while (top) putchar(OPT::buf[top--]);
if (pt) putchar(aft);
} const int maxn = 200010;
const int INF = 1000000010; struct OP {
int l, r, k, id;
};
std::vector<OP> Q; int n, m;
int ans[maxn], tree[maxn]; int lowbit(int);
int query(int);
void update(int, const int);
void divide(int, int, std::vector<OP>&); int main() {
freopen("1.in", "r", stdin);
qr(n); qr(m);
for (int i = 1, x; i <= n; ++i) {
x = 0; qr(x); Q.push_back({-1, 0, x, i});
}
for (int i = 1, a, b, c; i <= m; ++i) {
a = b = c = 0; qr(a); qr(b); qr(c);
Q.push_back({a, b, c, i});
}
divide(-INF, INF, Q);
for (int i = 1; i <= m; ++i) qw(ans[i], '\n', true);
return 0;
} void divide(int l, int r, std::vector<OP> &v) {
if (!v.size()) return;
if (l == r) {
for (auto i : v) if (i.l != -1) ans[i.id] = l;
return;
}
std::vector<OP>ldown, rdown;
int mid = (l + r) >> 1;
for (auto i : v) {
if (i.l == -1) {
if (i.k <= mid) {
update(i.id, 1);
ldown.push_back(i);
} else rdown.push_back(i);
}
}
for (auto i : v) {
if (i.l != -1) {
int k = query(i.r) - query(i.l - 1);
if ((k) >= i.k) ldown.push_back(i);
else {
i.k -= k; rdown.push_back(i);
}
}
}
for (auto i : ldown) {
if (i.l == -1) update(i.id, -1);
}
divide(l, mid, ldown);
divide(mid + 1, r, rdown);
} inline int lowbit(int x) {return x & -x;} void update(int x, const int v) {
while (x <= n) {
tree[x] += v;
x += lowbit(x);
}
} int query(int x) {
int _ret = 0;
while (x) {
_ret += tree[x];
x -= lowbit(x);
}
return _ret;
}

【整体二分】【P3834】 【模板】可持久化线段树 1(主席树)的更多相关文章

  1. 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]

    题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...

  2. P3919 【模板】可持久化数组 -初步探究主席树

    本篇blog主要是给自己(大家)看的. 感谢longlongzhu123奆佬(此人初二LCT)的指点,使本蒟蒻可以快速开始主席树入门. what is 主席树? $        $主席树这个名字只不 ...

  3. 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665

    如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...

  4. POJ 2104 K-th Number(分桶,线段树,主席树)

    一道比较经典的数据结构题.可以用多种方式来做. 一,分桶法(平方分解). 根据数字x的大小和区间内不大于x的数字数量cnt的单调性,可知第k大数kth对应的cnt应该满足cnt≥k, 且kth是满足条 ...

  5. 【题解】BZOJ3489 A Hard RMQ problem(主席树套主席树)

    [题解]A simple RMQ problem 占坑,免得咕咕咕了,争取在2h内写出代码 upd:由于博主太菜而且硬是要用指针写两个主席树,所以延后2hQAQ upd:由于博主太菜而且太懒所以他决定 ...

  6. poj 2104 K-th Number 划分树,主席树讲解

    K-th Number Input The first line of the input file contains n --- the size of the array, and m --- t ...

  7. 【BZOJ4771】七彩树(主席树)

    [BZOJ4771]七彩树(主席树) 题面 BZOJ 题解 如果没有深度限制,每次只询问子树内的颜色个数,除了树套树\(dfs\)序加前驱或者后继强行二维数点之外,还有这样一种做法: 把所有相同颜色的 ...

  8. 洛谷P3248 树 [HNOI2016] 主席树+倍增+分治

    正解:主席树+倍增+分治 解题报告: 传送门! 首先看到这题会想到之前考过的这题 但是那题其实简单一些,,,因为那题只要用个分治+预处理就好,只是有点儿思维难度而已 这题就不一样,因为它说了是按照原树 ...

  9. BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树

    BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树 题意: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastan ...

  10. POJ 2761 Feed the dogs(平衡树or划分树or主席树)

    Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to feed the dogs ...

随机推荐

  1. DenseNet——Densely Connected Convolutional Networks

    1. 摘要 传统的 L 层神经网络只有 L 个连接,DenseNet 的结构则有 L(L+1)/2 个连接,每一层都和前面的所有层进行连接,所以称之为密集连接的网络. 针对每一层网络,其前面所有层的特 ...

  2. unload没有用

    今天下午测试了unload这个事件包括beforeunload <script type="text/javascript"> window.addEventListe ...

  3. spring冲刺第七天

    昨天进行地图和人物的代码整合,有所缺陷. 今天使人物成功的在地图上运动,并设计炸弹爆炸效果. 遇到的问题:炸弹不会吧人物炸死,只会炸没砖块.

  4. 软件共享平台的NABCD

    Need: 我感觉我们这个软件很适合现在的大学生,特别是大一大二的学生,由于在大学里面学生都在各忙各的,学生遇到问题如果自己在网上查找,这就需要花费大量的时间,如果有了这个软件学生和老师都可以在这个平 ...

  5. BETA随笔6/7

    前言 我们居然又冲刺了·六 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 过去两天完成了哪些任务 新方案代码比之前的更简单,但是对场景的要求相应变高了,已经实现,误差感人 代码 ...

  6. 结对项目-小学生四则运算系统(GUI)

    Coding克隆地址:https://git.coding.net/FrrLolix/CalGUI.git 伙伴博客:http://www.cnblogs.com/wangyy39/p/8763244 ...

  7. HTTP&HTTPS、GET&POST

    1.HTTP&HTTPS: HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure ...

  8. [建树(非二叉树)] 1106. Lowest Price in Supply Chain (25)

    1106. Lowest Price in Supply Chain (25) A supply chain is a network of retailers(零售商), distributors( ...

  9. ASP.NET MVC 1.0 参考源码索引

    http://www.projky.com/asp.netmvc/1.0/System/Web/Mvc/AcceptVerbsAttribute.cs.htmlhttp://www.projky.co ...

  10. 订制EditText光标

    订制EditText光标 设置背景android:background="@null" 设置光标样式:android:textCursorDrawable="@drawa ...