[luoguP3332] [ZJOI2013]K大数查询(树套树)
一开始想的是区间线段树套权值线段树,结果好像不能实现。
然后题解是权值线段树套区间线段树。
区间线段树上标记永久化就省去了pushdown的操作减少常数。
标记永久化的话。。yy不出来就看代码吧。
然后注意开long long
#include <cstdio>
#include <iostream>
#include <algorithm>
#define N 50010
#define LL long long using namespace std; int n, m, t, cnt;
LL sum[N * 200];
int opt[N], a[N], b[N], c[N], g[N], add[N * 200], ls[N * 200], rs[N * 200], root[N << 2]; inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} inline void insert2(int &now, int l, int r, int x, int y)
{
if(!now) now = ++cnt;
if(x <= l && r <= y)
{
add[now]++;
sum[now] += r - l + 1;
return;
}
int mid = (l + r) >> 1;
if(x <= mid) insert2(ls[now], l, mid, x, y);
if(mid < y) insert2(rs[now], mid + 1, r, x, y);
sum[now] = sum[ls[now]] + sum[rs[now]] + (LL)(r - l + 1) * add[now];
} inline void insert1(int now, int l, int r, int d, int x, int y)
{
insert2(root[now], 1, n, x, y);
if(l == r) return;
int mid = (l + r) >> 1;
if(d <= mid) insert1(now << 1, l, mid, d, x, y);
else insert1(now << 1 | 1, mid + 1, r, d, x, y);
} inline LL query2(int now, int l, int r, int x, int y)
{
if(x <= l && r <= y) return sum[now];
LL tmp = 0;
int mid = (l + r) >> 1;
if(x <= mid) tmp += query2(ls[now], l, mid, x, y);
if(mid < y) tmp += query2(rs[now], mid + 1, r, x, y);
return tmp + (LL)(min(r, y) - max(l, x) + 1) * add[now];
} inline int query1(int now, int l, int r, LL d, int x, int y)
{
if(l == r) return l;
int mid = (l + r) >> 1;
LL tmp = query2(root[now << 1 | 1], 1, n, x, y);
if(tmp < d) return query1(now << 1, l, mid, d - tmp, x, y);
else return query1(now << 1 | 1, mid + 1, r, d, x, y);
} int main()
{
int i;
n = read();
m = read();
for(i = 1; i <= m; i++)
{
opt[i] = read();
a[i] = read(), b[i] = read(), c[i] = read();
if(opt[i] == 1) g[++t] = c[i];
}
sort(g + 1, g + t + 1);
t = unique(g + 1, g + t + 1) - g - 1;
for(i = 1; i <= m; i++)
if(opt[i] == 1)
{
c[i] = lower_bound(g + 1, g + t + 1, c[i]) - g;
insert1(1, 1, t, c[i], a[i], b[i]);
}
else printf("%d\n", g[query1(1, 1, t, c[i], a[i], b[i])]);
return 0;
}
[luoguP3332] [ZJOI2013]K大数查询(树套树)的更多相关文章
- P3332 [ZJOI2013]K大数查询(线段树套线段树+标记永久化)
P3332 [ZJOI2013]K大数查询 权值线段树套区间线段树 把插入的值离散化一下开个线段树 蓝后每个节点开个线段树,维护一下每个数出现的区间和次数 为了防止MLE动态开点就好辣 重点是标记永久 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)
题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 & 3236 [Ahoi2013] 作业 题解
[原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 978 Solved: 476 Descri ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- Cogs 1345. [ZJOI2013] K大数查询(树套树)
[ZJOI2013] K大数查询 /* 树套树写法. bzoj过不了. 可能有负数要离散吧. 线段树套线段树. 外层权值线段树,内层区间线段树维护标记. 对权值建一棵权值线段树. 某个点表示权值在某个 ...
- BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )
BIT+(可持久化)权值线段树, 用到了BIT的差分技巧. 时间复杂度O(Nlog^2(N)) ---------------------------------------------------- ...
- BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 418 Solved: 235 [ Submit][ ...
随机推荐
- 感谢我的python老师
Python自动化开发(金角大王版) http://www.cnblogs.com/alex3714/articles/5885096.html
- 操作系统(3)_CPU调度_李善平ppt
不只上面的四种,比如时间片到了也会引起调度. 具体的调度算法: fcfs简单,但是波动很大. 最高相应比算法,执行时间最长就应该等待的长点,比sjf多了一个等待时间的考虑. 硬件定时器和软件计数器共同 ...
- ZendFramework-2.4 源代码 - ViewManager类图
- 如何使用pyinstaller打包32位的exe
说明:原来安装的python为64位,故安装的pyinstaller和打包后的exe都为64位.而64位的exe文件在32位的win7操作系统下是无法执行的,显示不兼容.网上查询发现,简单(可能不方便 ...
- GoF23种设计模式之结构型模式之桥接模式
一.概述 将类的抽象部分与实现分部分离开来,使它们都可以独立地变化. 二.适用性 1.你不希望在抽象和实现之间有一个固定的绑定关系的时候.例如:在程序运行时实现部分应可以被选择或切换. ...
- debug模式开启会做哪些事(源码分析)
以往开发中不管是django框架下开发还是其它框架下开发, 只知道在开发阶段要开启debug模式, 却一直没有深究它会我们做哪些事, 今天使用tornado时偶然看到源码中写的很清楚,故写下来加深印象 ...
- Python9-IO模型-day41
# 进程:启动多个进程,进程之间是由操作系统负责调用# 线程:启动多个线程,真正由被cpu执行的最小单位实际是线程# 开启一个线程,创建一个线程,寄存器.堆栈# 关闭一个线程# 协程# 本质上是一个线 ...
- linux下的source命令
Linux Source命令及脚本的执行方式解析 当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录:这时就想到用source命令,如:source /etc/profile ...
- HDU:3336-Count the string(next数组理解)
Count the string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pr ...
- poj 2139 奶牛拍电影问题 floyd算法
题意:奶牛拍一系列电影,n头牛拍m部电影,同一部电影种的搭档们距离为1,求最小距离? 思路:Floyd 图 最短路径 存图: 初始化图 for (int i = 0; i <= n; i++) ...