【BZOJ3110】【LG3332】[ZJOI2013]K大数查询

题面

洛谷

BZOJ

题解

和普通的整体分治差不多

用线段树维护一下每个查询区间内大于每次二分的值\(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大数查询的更多相关文章

  1. 【BZOJ3110】[Zjoi2013]K大数查询 树套树

    [BZOJ3110][Zjoi2013]K大数查询 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c,如果 ...

  2. 【bzoj3110】[Zjoi2013]K大数查询 权值线段树套区间线段树

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

  3. 【BZOJ3110】[ZJOI2013]K大数查询(整体二分)

    题目: BZOJ3110 分析: 整体二分模板题-- 先明确一下题意:每个位置可以存放多个数,第一种操作是"加入 (insert) "一个数而不是"加上 (add) &q ...

  4. 【bzoj3110】 Zjoi2013—K大数查询

    http://www.lydsy.com/JudgeOnline/problem.php?id=3110 (题目链接) 题意 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在 ...

  5. BZOJ3110:[ZJOI2013]K大数查询

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...

  6. 【bzoj3110】[Zjoi2013]K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...

  7. BZOJ3110:[ZJOI2013]K大数查询——题解

    +++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...

  8. BZOJ3110:[ZJOI2013]K大数查询(整体二分版)

    浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...

  9. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

随机推荐

  1. 关于javascript的单线程和异步的一些问题

    关于js单线程和异步方面突然就糊涂了,看别人的文章越看越糊涂,感觉这方面是个坑,跳进去就不好跳出来.再去看,看着看着感觉自己明白了一些东西,也不知道对不对,反正是暂时把自己说服了,这样理解能理解的通, ...

  2. BZOJ1079:[SCOI2008]着色方案(DP)

    Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个 ...

  3. 5、Spring Cloud-声明式调用 Feign(下)

    5.5.在Feign中使用HttpClient和OkhHttp Feign 中.Client 是一个非常重要的组件, Feign 最终发送 Request 请求以及接收 Response响应都是由 C ...

  4. [转]对象映射类AutoMapper的使用

    由于原文太长了,此处就直接贴上原文的超链接,大家自行学习. codeproject中的一篇文章: AutoMapper

  5. SublimeLinter插件对PHP语法检测不起作用的解决办法

    系统:windows7+sublime3 1.安装sublimelinter ctrl+shift+p=>pi=>回车=>sublimelinter=>回车 2.安装好后进行配 ...

  6. 【题解】洛谷P1073 [NOIP2009TG] 最优贸易(SPFA+分层图)

    次元传送门:洛谷P1073 思路 一开始看题目嗅出了强连通分量的气息 但是嫌长没打 听机房做过的dalao说可以用分层图 从来没用过 就参考题解了解一下 因为每个城市可以走好几次 所以说我们可以在图上 ...

  7. Gradle Goodness: Renaming Files while Copying

    With the Gradle copy task we can define renaming rules for the files that are copied. We use the ren ...

  8. linux crontab 计划任务设置 (简结)

    命令: crontab  -l  查看当前运行的计划任务 crontab  -e  编辑当前运行计划任务 修改或添加 VIM编辑器用法:按 i 键进入编辑文本状态, esc 结束编辑状态 , :wq ...

  9. LeetCode41.缺失的第一个正数 JavaScript

    给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11 ...

  10. activiti获取到流程图节点信息之任务节点

    //获取bpmnModel对象 BpmnModel model1 = new BpmnJsonConverter().convertToBpmnModel(modelNode); //由于我们这里仅仅 ...