【树套树】bzoj3110 [Zjoi2013]K大数查询
题解很多,实现起来以外地简洁。内层的区间线段树上用了标记永久化。
#include<cstdio>
using namespace std;
#define N 50001
struct Node{int sumv,tag,lc,rc;}T[N*256];
int e;
int n,m;
void Update(int ql,int qr,int cur,int l,int r)
{
if(ql<=l&&r<=qr)
++T[cur].tag;
else
{
int m=(l+r>>1);
if(ql<=m)
{
if(!T[cur].lc) T[cur].lc=++e;
Update(ql,qr,T[cur].lc,l,m);
}
if(m<qr)
{
if(!T[cur].rc) T[cur].rc=++e;
Update(ql,qr,T[cur].rc,m+1,r);
}
}
T[cur].sumv=T[T[cur].lc].sumv+T[T[cur].rc].sumv+T[cur].tag*(r-l+1);
}
int Query(int ql,int qr,int cur,int l,int r,int tag)
{
if(ql<=l&&r<=qr) return T[cur].sumv+(r-l+1)*tag;
int m=(l+r>>1),res=0;
if(ql<=m) res+=Query(ql,qr,T[cur].lc,l,m,tag+T[cur].tag);
if(m<qr) res+=Query(ql,qr,T[cur].rc,m+1,r,tag+T[cur].tag);
return res;
}
int root[N<<2];
void Update_2D(int ql,int qr,int p,int rt,int l,int r)
{
if(!root[rt]) root[rt]=++e;
Update(ql,qr,root[rt],1,n);
if(l==r) return;
int m=(l+r>>1);
if(p<=m) Update_2D(ql,qr,p,rt<<1,l,m);
else Update_2D(ql,qr,p,rt<<1|1,m+1,r);
}
int Query_2D(int ql,int qr,int K,int rt,int l,int r)
{
if(l==r) return l;
int m=(l+r>>1);
int Src=Query(ql,qr,root[rt<<1|1],1,n,0);
if(Src>=K) return Query_2D(ql,qr,K,rt<<1|1,m+1,r);
else return Query_2D(ql,qr,K-Src,rt<<1,l,m);
}
int main()
{
int op,x,y,z;
scanf("%d%d",&n,&m);
for(;m;--m)
{
scanf("%d%d%d%d",&op,&x,&y,&z);
if(op==1) Update_2D(x,y,z,1,1,n);
else printf("%d\n",Query_2D(x,y,z,1,1,n));
}
return 0;
}
【树套树】bzoj3110 [Zjoi2013]K大数查询的更多相关文章
- 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 & 3236 [Ahoi2013] 作业 题解
[原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 978 Solved: 476 Descri ...
- BZOJ3110[Zjoi2013]K大数查询(树状数组+整体二分)
3110 [Zjoi2013]K大数查询 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a ...
- BZOJ3110 [Zjoi2013]K大数查询 树套树 线段树 整体二分 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3110 题意概括 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位 ...
- BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...
- bzoj3110: [Zjoi2013]K大数查询 【cdq分治&树套树】
模板题,折腾了许久. cqd分治整体二分,感觉像是把询问分到答案上. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = ...
- [BZOJ3110] [Zjoi2013] K大数查询 (树套树)
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...
- BZOJ3110: [Zjoi2013]K大数查询
喜闻乐见的简单树套树= =第一维按权值建树状数组,第二维按下标建动态开点线段树,修改相当于第二维区间加,查询在树状数组上二分,比一般的线段树还短= =可惜并不能跑过整体二分= =另外bzoj上的数据有 ...
- bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】
//========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/ 转载要声明! //=============== ...
- bzoj3110 [Zjoi2013]K大数查询——线段树套线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3110 外层权值线段树套内层区间线段树: 之所以外层权值内层区间,是因为区间线段树需要标记下传 ...
随机推荐
- POJ2289:Jamie's Contact Groups(二分+二分图多重匹配)
Jamie's Contact Groups Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/ ...
- bzoj 3771 Triple FFT 生成函数+容斥
Triple Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 847 Solved: 482[Submit][Status][Discuss] Desc ...
- npm安装node-sass失败,EACCES: permission denied
增加--unsafe-perm,即 sudo npm install node-sass --unsafe-perm --save-dev 成功安装node-sass
- 关于javascript中的this 一段小实例深有体会啊
先声明鄙人正在努力的把脚抬进门来,说的都是比较粗浅的知识,但都是我实践中得出的体会,很深刻. 正在自学中挣扎的DOG. 先看段代码: function highlightRows() { if(!d ...
- 利用java.lang.reflect.Constructor动态实例化对象
} } } } } Student t = co ...
- 转:Mybatis系列之集合映射
转:Mybatis系列之集合映射 上篇文章我们讲了关联映射,实现了销售与登录用户之间的关联.本文我们接着来讲一讲集合映射,实现销售与客户的多对多关系. 实现销售与客户多对多关系 本文中仍延用<M ...
- struts学习笔记(四)
一. 文件的上传: 1). 表单需要注意的 3 点 2). Struts2 的文件上传实际上使用的是 Commons FileUpload 组件, 所以需要导入 commons-fileupload- ...
- ACM-ICPC 2018 南京赛区网络预赛 Sum
A square-free integer is an integer which is indivisible by any square number except 11. For example ...
- YDB基本使用详解(转)
第七章YDB基本使用详解 一.如何与YDB对接(交互) 目前延云YDB提供如下几种方式 l命令行的方式 lWeb http接口的方式 lJDBC接口的方式 通过Java编程接入 通过可视化SQL分析统 ...
- 【bzoj4310/hdu5030-跳蚤】后缀数组
我真的是..调了一百年.. 傻逼的人生.. 而且这题好像可以用sam做哎!我Y出了一个奇怪的办法.. 好吧sam是不能做这题的.搞错了. 说说后缀数组好了.. 搞后缀数组 然后我们要二分一个子串,判断 ...