题目链接:

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

题目:

有N个位置,M个操作。操作有两种,每次操作如果是:

  • 1 a b c:表示在第a个位置到第b个位置,每个位置加上一个数c
  • 2 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大数查询相关推荐

  1. bzoj 3110: [Zjoi2013]K大数查询(树套树)

    树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...

  2. bzoj:3110: [Zjoi2013]K大数查询

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

  3. 3110: [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...

  4. bzoj3110 [Zjoi2013]K大数查询

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

  5. [BZOJ3110] [Zjoi2013]K大数查询

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

  6. 洛谷 P3332 [ZJOI2013]K大数查询 解题报告

    P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...

  7. BZOJ3110: [Zjoi2013]K大数查询

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

  8. P3332 [ZJOI2013]K大数查询(整体二分做法)

    P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 [模板]可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改 ...

  9. bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】

    //========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/  转载要声明! //=============== ...

最新文章

  1. HBase - Phoenix剖析
  2. C++学习之路(六):实现一个String类
  3. 设计模式 - 建造者模式(Builder Pattern)
  4. 将ArXiv中的Reference导入EndNote
  5. 编译器构造 c语言描,编译器构造C语言描述
  6. A sample that using the completion port I/O model
  7. C++之explicit探究
  8. StarlingMVC:为Starling量身打造的MVC框架
  9. java中类初始化_java中类和对象的初始化
  10. h5的table表格边框线问题解决方案
  11. 中兴上网卡 linux,4G网卡中兴MF831移植到linux
  12. 立即寻址,直接寻址,间接寻址
  13. markdown文件怎么转换成html,将markdown文件转换为html文件(MarkdownPad)
  14. py使用bar绘制堆积/带误差棒柱形图
  15. vue3+ts+setup语法糖
  16. tv端h5_最新版H5双端影视APP源码
  17. delphi获取外网IP
  18. 二手时间:人类的精神本质就是疲惫和痛苦的
  19. Banana Pi BPI-R2 Pro 开源路由器采用瑞芯微Rockchip RK3568芯片方案设计
  20. win8常见系统漏洞

热门文章

  1. 利用BI进行报表分析(二)--SSAS多维数据集以及维度的建立
  2. Silverlight 国外技术文章
  3. 《菜菜的机器学习sklearn课堂》学习笔记 + 课件
  4. Windows域策略设置 IE信任站点【全域策略生效】
  5. Thinkphp查询数据转成layui的展示格式
  6. IT程序员必知!TCP/IP为什么会有这么多的致命漏洞?
  7. libspark.swfassist的体会
  8. android canvas 工作流_行情艰难,Android初中级面试题助你逆风翻盘,每题都有详细答案...
  9. matlab ct投影数据,CT_projection_and_reconstruction
  10. linux php错误日志在哪里,宝塔的php错误日志在哪