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. 二值形态学——腐蚀与膨胀 及 C语言代码实现

    参考文献:数字图像处理(第三版) 何东健 西安电子科技大学出版社 二值形态学中的运算对象是集合, 但实际运算中, 当涉及两个集合时并不把它们看作是互相对等的. 一般设A为图像集合, S为结构元素, 数 ...

  2. 《metasploit渗透测试魔鬼训练营》学习笔记第四章—web应用渗透

    继续来学习metasploit...记好笔记是很重要的,下面开始正文: 二.WEB应用渗透技术     1.WEB应用渗透基础知识        先介绍WEB应用攻击的主要类型(大致介绍,具体请自行查 ...

  3. 如何彻底修改eclipse中的名称

    一.右键工程:Refactor->Rename,或选中工程按F2,修改名称二.修改项目目录下:.project文件 <?xml version="1.0" encodi ...

  4. String 的字面量、常量池、构造函数和intern()函数

    一.内存中的 String 对象 Java 的堆和栈 对于基本数据类型变量和对象的引用,也就是局部变量表属于栈内存: 而通过 new 关键字和 constructor 创建的对象存放在堆内存: 直接的 ...

  5. webpack4.x最详细入门讲解

    前言 本文主要从webpack4.x入手,会对平时常用的Webpack配置一一讲解,各个功能点都有对应的详细例子,所以本文也比较长,但如果你能动手跟着本文中的例子完整写一次,相信你会觉得Webpack ...

  6. WebGl 平移(矩阵变换)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. filter 图片滤镜的各种设置

    filter 图片滤镜 给当前元素加滤镜_改变它的明亮度 定义:filter 属性定义了元素(通常是<img>)的可视效果(例如:模糊与饱和度).作用在图片上或元素上.div{ },或 d ...

  8. PHP获取一篇文章内容中的全部图片,并下载

  9. T6跨账套辅助工具[v1.04]

    [v1.03] 增加自定义报表,用户可以自行设置报表所打开的数据表,然后设置查询条件 [v1.04]更改单据显示样式,直接以用友打印预览的方式显示,允许用自定义显示,打印样式 下图为新的显示样式 下图 ...

  10. 一图看懂hadoop Spark On Yarn工作原理

    hadoop Spark On Yarn工作原理