3110: [Zjoi2013]K大数查询

https://lydsy.com/JudgeOnline/problem.php?id=3110

分析:

  整体二分+线段树。

  两种操作:区间加入一个数,区间询问第k大值。

  如果只有一种操作,我们可以二分答案x,然后把大于x的都加入到线段树中去(区间[l,r]整体+1),然后查询这次询问的区间有多少数(区间[l,r]求和)。

  多种操作的话整体二分就行了,注意到有时间顺序,所以可以按照时间顺序加入和查询。

  注意一下要开longlong。

代码:

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
#define Root 1, n, 1
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ; int ans[N], n, m;
struct Que{
int ty, l, r, v, id;
bool operator < (const Que &A) const {
return id < A.id;
}
}A[N], tl[N], tr[N];
struct SegmentTree{
LL sum[N << ], tag[N << ];
void pushup(int rt) { sum[rt] = sum[rt << ] + sum[rt << | ]; }
void pushdown(int rt,int len) {
sum[rt << ] += 1ll * (len - len / ) * tag[rt];
sum[rt << | ] += 1ll * (len / ) * tag[rt];
tag[rt << ] += tag[rt];
tag[rt << | ] += tag[rt];
tag[rt] = ;
}
void update(int l,int r,int rt,int L,int R,int v) {
if (L <= l && r <= R) {
tag[rt] += v, sum[rt] += (r - l + ) * v; return ;
}
if (tag[rt]) pushdown(rt, r - l + );
int mid = (l + r) >> ;
if (L <= mid) update(lson, L, R, v);
if (R > mid) update(rson, L, R, v);
pushup(rt);
}
LL query(int l,int r,int rt,int L,int R) {
if (L <= l && r <= R) return sum[rt];
if (tag[rt]) pushdown(rt, r - l + );
int mid = (l + r) >> ; LL res = ;
if (L <= mid) res += query(lson, L, R);
if (R > mid) res += query(rson, L, R);
return res;
}
}T; void solve(int l,int r,int Head,int Tail) {
if (Head > Tail) return ;
if (l == r) {
for (int i = Head; i <= Tail; ++i)
if (A[i].ty == ) ans[A[i].id] = l;
return ;
}
int mid = (l + r + ) >> , cl = , cr = ;
for (int i = Head; i <= Tail; ++i) {
if (A[i].ty == ) {
if (A[i].v >= mid) T.update(Root, A[i].l, A[i].r, ), tr[++cr] = A[i];
else tl[++cl] = A[i];
}
else {
LL t = T.query(Root, A[i].l, A[i].r);
if (t >= A[i].v) tr[++cr] = A[i];
else A[i].v -= t, tl[++cl] = A[i];
}
}
for (int i = Head; i <= Tail; ++i) if (A[i].ty == && A[i].v >= mid) T.update(Root, A[i].l, A[i].r, -);
for (int i = ; i <= cl; ++i) A[i + Head - ] = tl[i];
for (int i = ; i <= cr; ++i) A[i + Head + cl - ] = tr[i];
solve(l, mid - , Head, Head + cl - );
solve(mid, r, Head + cl, Tail);
}
int main() {
n = read(), m = read(); int Q = ;
for (int i = ; i <= m; ++i) {
A[i].ty = read(), A[i].l = read(), A[i].r = read(), A[i].v = read(), A[i].id = ;
if (A[i].ty == ) A[i].id = ++Q;
}
solve(, n, , m);
for (int i = ; i <= Q; ++i) printf("%d\n",ans[i]);
return ;
}

3110: [Zjoi2013]K大数查询的更多相关文章

  1. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  2. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  3. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  4. BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )

    BIT+(可持久化)权值线段树, 用到了BIT的差分技巧. 时间复杂度O(Nlog^2(N)) ---------------------------------------------------- ...

  5. BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec   Memory Limit: 512 MB Submit: 418   Solved: 235 [ Submit][ ...

  6. BZOJ 3110 [Zjoi2013]K大数查询(整体二分)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 11654  Solved: 3505[Submit][St ...

  7. BZOJ 3110 [Zjoi2013]K大数查询 (CDQ分治+树状数组)

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

  8. [BZOJ 3110] [Zjoi2013] K大数查询 【树套树】

    题目链接: BZOJ - 3110 题目分析 这道题是一道树套树的典型题目,我们使用线段树套线段树,一层是区间线段树,一层是权值线段树.一般的思路是外层用区间线段树,内层用权值线段树,但是这样貌似会很 ...

  9. bzoj 3110 [Zjoi2013]K大数查询——线段树套线段树(标记永久化)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3110 第一道线段树套线段树! 第一道标记永久化! 为什么为什么写了两个半小时啊…… 本想线段 ...

随机推荐

  1. 问题:alias设置与删除

    新建alias条目 临时 alias  monitor='gnome-system-monitor' 永久 可以在家目录下,新建    .bash_aliases 文件,然后在其中加上你想要的替换的比 ...

  2. 动画的分类:属性(几何)动画、内容(视频)动画:gpu vs cpu

    属性动画通过gpu根据属性来呈现: 内容动画通过cpu解码内容按照时间呈现给gpu: (或者gpu直接解码现实?)

  3. TensorFlow学习之 图像预处理

    import tensorflow as tf import matplotlib.pyplot as plt image_raw_data = tf.gfile.GFile("./pict ...

  4. html字段验证

    (1)连接去掉下划线:style="text-decoration:none" <a href="/example/html/lastpage.html" ...

  5. Git删除commit提交的log记录

    基于 GitFlow 工作流,可能某个提交(commit)导致了 bug,或者有多个提交需要返工,此时你就会用到删除提交. 接下来的内容都基于下面这张 git log 提交记录图来写.   git l ...

  6. 404 Note Found队-Alpha3

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最 ...

  7. Linux文本处理

    作为一名 Linux 研发人员,几乎每天都要面对文本处理场景. 因此 掌握文本处理套路 并 熟练运用文本处理命令 ,对于 提升工作效率 意义重大. 本文以一个实战例子抛砖引玉,介绍如何运用 grep ...

  8. B+树全面解析

    B+树的特征与结构 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点. 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的 ...

  9. Java多线程入门知识点梳理

    前言 在多核时代,高并发时代,对系统并行处理能力有很高要求.多线程就是这个时代最好的产物.通过使用多线程可以增强系统并行处理能力,提高CPU资源的有效利用:从而提高系统的处理能力.常见应用场景如:多窗 ...

  10. Apache安装排错

    今天安装一下Apache,发现报错,且在网上没有找到相关解决方法,所以记录一下 安装步骤:将下载好的apache包放置到要放置的目录中,最好是盘根目录下,然后命令行下进入到apache下面的bin目录 ...