[bzoj 3110] [ZJOI2013] K大数查询
题目链接:
https://www.lydsy.com/JudgeOnline/problem.php?id=3110
题目:
有N个位置,M个操作。操作有两种,每次操作如果是:
1 a b c
:表示在第a个位置到第b个位置,每个位置加上一个数c2 a b c
:表示询问从第a个位置到第b个位置,第C大的数是多少。
题解:
注意每一个位置加上一个数并不是数字的加,而是在这个位置上多放一个数
重新捡起OI的我现在还只会线段树套线段树的做法
考虑权值线段树套区间线段树,对于每一段权值区间维护一棵区间线段树,线段树的每一个点代表在该区间内当前权值所有的元素出现的次数
输出答案的时候二分查找
蛮好维护的不是吗?注意要动态开点,顺便把加入的数给离散化一下
代码:
#include<algorithm> #include<cstring> #include<cstdio> #include<iostream> using namespace std; typedef long long ll;const int N=5e4+15; int n,m,tot,cnt; int root[N<<2]; ll a[N]; struct E {int op,a,b;ll c; }e[N]; struct Tree {int l,r,lazy;ll s; }t[N*400]; inline ll read() {char ch=getchar();ll s=0,f=1;while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9') {s=(s<<3)+(s<<1)+ch-'0';ch=getchar();}return s*f; } void pushdown(int o,int l,int r) {if (!t[o].lazy||l==r) return;int mid=l+r>>1;int d=t[o].lazy;t[o].lazy=0;if (!t[o].l) t[o].l=++cnt;if (!t[o].r) t[o].r=++cnt;t[t[o].l].lazy+=d;t[t[o].l].s+=(mid-l+1)*d;t[t[o].r].lazy+=d;t[t[o].r].s+=(r-mid)*d; } void pushup(int o) {t[o].s=t[t[o].l].s+t[t[o].r].s; } void ins2(int &o,int l,int r,int x,int y) {if (!o) o=++cnt;if (l>=x&&r<=y){t[o].s+=r-l+1;t[o].lazy++;return;}pushdown(o,l,r);int mid=l+r>>1;if (x<=mid) ins2(t[o].l,l,mid,x,y);if (y>mid) ins2(t[o].r,mid+1,r,x,y);pushup(o); } void ins1(int o,int l,int r,int x,int y,int z)//对每一个包含添加的数的区间在x~y的值都加1 {ins2(root[o],1,n,x,y);if (l==r) return;int mid=l+r>>1;if (z<=mid) ins1(o<<1,l,mid,x,y,z);else ins1(o<<1|1,mid+1,r,x,y,z); } ll qsum(int o,int l,int r,int x,int y) {if (!o) return 0;if (l>=x&&r<=y) return t[o].s;pushdown(o,l,r);int mid=l+r>>1;ll re=0;if (x<=mid) re+=qsum(t[o].l,l,mid,x,y);if (y>mid) re+=qsum(t[o].r,mid+1,r,x,y);return re; } int query(int o,int l,int r,int a,int b,int c) {if (l==r) return l;int mid=l+r>>1;ll sz=qsum(root[o<<1|1],1,n,a,b);if (sz>=c) return query(o<<1|1,mid+1,r,a,b,c);else return query(o<<1,l,mid,a,b,c-sz); } int main() {n=read();m=read();for (int i=1;i<=m;i++){e[i].op=read();e[i].a=read();e[i].b=read();e[i].c=read();if (e[i].op==1) a[++tot]=e[i].c;}sort(a+1,a+1+tot);tot=unique(a+1,a+1+tot)-a-1;for (int i=1;i<=m;i++) if (e[i].op==1) e[i].c=lower_bound(a+1,a+1+tot,e[i].c)-a;for (int i=1;i<=m;i++){if (e[i].op==1) ins1(1,1,tot,e[i].a,e[i].b,e[i].c);if (e[i].op==2) printf("%lld\n",a[query(1,1,tot,e[i].a,e[i].b,e[i].c)]);}return 0; }
转载于:https://www.cnblogs.com/xxzh/p/10581081.html
[bzoj 3110] [ZJOI2013] K大数查询相关推荐
- bzoj 3110: [Zjoi2013]K大数查询(树套树)
树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...
- bzoj:3110: [Zjoi2013]K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- 3110: [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...
- bzoj3110 [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 10703 Solved: 3209 [Submit][ ...
- [BZOJ3110] [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 9208 Solved: 2737 [Submit][S ...
- 洛谷 P3332 [ZJOI2013]K大数查询 解题报告
P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...
- BZOJ3110: [Zjoi2013]K大数查询
BZOJ3110: [Zjoi2013]K大数查询 Description 有N个位置,M个操作. 操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如 ...
- P3332 [ZJOI2013]K大数查询(整体二分做法)
P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 [模板]可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改 ...
- bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】
//========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/ 转载要声明! //=============== ...
最新文章
- HBase - Phoenix剖析
- C++学习之路(六):实现一个String类
- 设计模式 - 建造者模式(Builder Pattern)
- 将ArXiv中的Reference导入EndNote
- 编译器构造 c语言描,编译器构造C语言描述
- A sample that using the completion port I/O model
- C++之explicit探究
- StarlingMVC:为Starling量身打造的MVC框架
- java中类初始化_java中类和对象的初始化
- h5的table表格边框线问题解决方案
- 中兴上网卡 linux,4G网卡中兴MF831移植到linux
- 立即寻址,直接寻址,间接寻址
- markdown文件怎么转换成html,将markdown文件转换为html文件(MarkdownPad)
- py使用bar绘制堆积/带误差棒柱形图
- vue3+ts+setup语法糖
- tv端h5_最新版H5双端影视APP源码
- delphi获取外网IP
- 二手时间:人类的精神本质就是疲惫和痛苦的
- Banana Pi BPI-R2 Pro 开源路由器采用瑞芯微Rockchip RK3568芯片方案设计
- win8常见系统漏洞
热门文章
- 利用BI进行报表分析(二)--SSAS多维数据集以及维度的建立
- Silverlight 国外技术文章
- 《菜菜的机器学习sklearn课堂》学习笔记 + 课件
- Windows域策略设置 IE信任站点【全域策略生效】
- Thinkphp查询数据转成layui的展示格式
- IT程序员必知!TCP/IP为什么会有这么多的致命漏洞?
- libspark.swfassist的体会
- android canvas 工作流_行情艰难,Android初中级面试题助你逆风翻盘,每题都有详细答案...
- matlab ct投影数据,CT_projection_and_reconstruction
- linux php错误日志在哪里,宝塔的php错误日志在哪