【BZOJ3110】【LG3332】[ZJOI2013]K大数查询
【BZOJ3110】【LG3332】[ZJOI2013]K大数查询
题面
题解
和普通的整体分治差不多
用线段树维护一下每个查询区间内大于每次二分的值\(mid\)的值即可
然后再按套路做就行了
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (ch != '-' && (ch > '9' || ch < '0')) ch = getchar();
if (ch == '-') w = -1 , ch = getchar();
while (ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = getchar();
return w * data;
}
typedef long long ll;
const int MAX_N = 50005;
#define lson (o << 1)
#define rson (o << 1 | 1)
struct SGT {
bool clr; int tag; ll val;
void clear() { clr = 0, tag = val = 0; }
} t[MAX_N << 2];
int N, M, ans[MAX_N];
void puttag(int o, int l, int r, int w) {
t[o].val += 1ll * w * (r - l + 1);
t[o].tag += w;
}
void clear(int o) {
if (t[o].clr) {
t[lson].clear(), t[rson].clear();
t[lson].clr = t[rson].clr = 1;
t[o].clr = 0;
}
}
void pushdown(int o, int l, int r) {
if (l == r) return ;
int mid = (l + r) >> 1;
clear(o);
puttag(lson, l, mid, t[o].tag);
puttag(rson, mid + 1, r, t[o].tag);
t[o].tag = 0;
}
void modify(int o, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return (void)puttag(o, l, r, 1);
pushdown(o, l, r);
int mid = (l + r) >> 1;
if (ql <= mid) modify(lson, l, mid, ql, qr);
if (qr > mid) modify(rson, mid + 1, r, ql, qr);
t[o].val = t[lson].val + t[rson].val;
}
ll query(int o, int l, int r, int ql, int qr) {
pushdown(o, l, r);
if (ql <= l && r <= qr) return t[o].val;
int mid = (l + r) >> 1; ll res = 0;
if (ql <= mid) res += query(lson, l, mid, ql, qr);
if (qr > mid) res += query(rson, mid + 1, r, ql, qr);
return res;
}
struct Query { int op, x, y; ll z; } q[MAX_N], lq[MAX_N], rq[MAX_N];
void Div(int lval, int rval, int st, int ed) {
if (st > ed) return ;
if (lval == rval) {
for (int i = st; i <= ed; i++)
if (q[i].op != 0) ans[q[i].op] = lval;
return ;
}
int mid = (lval + rval) >> 1;
int lt = 0, rt = 0;
for (int i = st; i <= ed; i++) {
if (q[i].op == 0) {
if (q[i].z <= mid) lq[++lt] = q[i];
else {
rq[++rt] = q[i];
modify(1, 1, N, q[i].x, q[i].y);
}
} else {
ll res = query(1, 1, N, q[i].x, q[i].y);
if (res >= q[i].z) rq[++rt] = q[i];
else q[i].z -= res, lq[++lt] = q[i];
}
}
for (int i = 1; i <= lt; i++) q[i + st - 1] = lq[i];
for (int i = 1; i <= rt; i++) q[i + lt + st - 1] = rq[i];
t[1].clear(); t[1].clr = 1;
Div(lval, mid, st, st + lt - 1);
Div(mid + 1, rval, st + lt, ed);
}
int main () {
int tot = 0;
N = gi(), M = gi();
for (int i = 1; i <= M; i++) {
q[i].op = gi() - 1;
q[i].x = gi(), q[i].y = gi(), q[i].z = gi();
if (q[i].op) q[i].op = ++tot;
}
Div(-N, N, 1, M);
for (int i = 1; i <= tot; i++) printf("%d\n", ans[i]);
return 0;
}
【BZOJ3110】【LG3332】[ZJOI2013]K大数查询的更多相关文章
- 【BZOJ3110】[Zjoi2013]K大数查询 树套树
[BZOJ3110][Zjoi2013]K大数查询 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c,如果 ...
- 【bzoj3110】[Zjoi2013]K大数查询 权值线段树套区间线段树
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- 【BZOJ3110】[ZJOI2013]K大数查询(整体二分)
题目: BZOJ3110 分析: 整体二分模板题-- 先明确一下题意:每个位置可以存放多个数,第一种操作是"加入 (insert) "一个数而不是"加上 (add) &q ...
- 【bzoj3110】 Zjoi2013—K大数查询
http://www.lydsy.com/JudgeOnline/problem.php?id=3110 (题目链接) 题意 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在 ...
- BZOJ3110:[ZJOI2013]K大数查询
浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...
- 【bzoj3110】[Zjoi2013]K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...
- BZOJ3110:[ZJOI2013]K大数查询——题解
+++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...
- BZOJ3110:[ZJOI2013]K大数查询(整体二分版)
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
随机推荐
- x-frame-options、iframe与iframe的一些操作
iframe的子操作父窗口,父操作子窗口: test.php: <!DOCTYPE html> <html> <head> <title>test< ...
- rocketmq双主发送消息 SLAVE_NOT_AVAILABLE 状态
RocketMQ最佳实践之Producer 投递状态 发送消息时,将得到包含SendStatus的SendResult.首先,我们假设消息的isWaitStoreMsgOK = true(默认是tru ...
- 小米root
ROOT之前,需要做几个准备工作: 首先,你需要去MIUI官网解锁,解锁教程见MIUI官网(百度搜索 MIUI解锁,第一个就是),然后根据官方指导进行解锁: 然后,因为MAX2的ROOT是卡刷,所以解 ...
- IIS - 虚拟目录与应用程序的异同
在Windows 7 IIS7中,对服务器建立站点后,有二种添加子站点的方式 A. 虚拟目录 B. 应用程序 简单总结下二者之间的异同 A.虚拟目录 虚拟目录是指在站点下建立一个虚拟子目录 ...
- 基于Python在MacOS上安装robotframework-ride
基于Python在MacOS上安装robotframework-ride https://www.jb51.net/article/153665.htm https://www.jianshu.com ...
- Web—08-移动端库和框架
移动端js事件 移动端的操作方式和PC端是不同的,移动端主要用手指操作,所以有特殊的touch事件,touch事件包括如下几个事件: 1.touchstart: //手指放到屏幕上时触发 2.touc ...
- Extjs6 编写自己的富文本组件(以ueditor为基础)
一.下载ueditor 地址:http://ueditor.baidu.com/website/ 二.将ueitor资源引入自己的项目 在index.html中引入ueditor.config.js. ...
- codeforces 979 C. Kuro and Walking Route
C. Kuro and Walking Route time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- jquery 增加与删除数组元素
1.数组元素的添加 demoArray.push(value); var demo=new Array(); var key=[4,5]; demo.push(1);//插入数字 demo.push( ...
- Windows Oracle连接ORA-12541:TNS:无监听程序
上面两篇是安装和连接,这里写一下碰到的问题,安装后使用SQL Developer连接出现ORA-12541:TNS:无监听程序.网上搜了一下是安装的Oracle中自带的JDK是32位,而程序中使用的S ...