解题:ZJOI 2013 K大数查询
树套树,权值线段树套序列线段树,每次在在权值线段树上的每棵子树上做区间加,查询的时候左右子树二分
本来想两个都动态开点的,这样能体现树套树在线的优越性。但是常数太大惹,所以外层直接固定建树了QAQ
就是不写整体二分╭(╯^╰)╮
Warning:Extremely ugly code detected
// luogu-judger-enable-o2
//I CAN PASS THE TEST
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int n,m,f,op,tot;
long long val[N];
int root[N],lson[N],rson[N],laz[N];
void read1(int &x)
{
x=; char ch=getchar();
while(!isdigit(ch))
ch=getchar();
while(isdigit(ch))
x=(x<<)+(x<<)+(ch^),ch=getchar();
}
void read2(int &x)
{
x=f=; char ch=getchar();
while(!isdigit(ch))
f|=ch=='-',ch=getchar();
while(isdigit(ch))
x=(x<<)+(x<<)+(ch^),ch=getchar();
x=f?-x:x;
}
void read3(long long &x)
{
x=; char ch=getchar();
while(!isdigit(ch))
ch=getchar();
while(isdigit(ch))
x=(x<<)+(x<<)+(ch^),ch=getchar();
}
void write(int x)
{
if(x>) write(x/);
putchar(x%|);
}
void Insert(int &nde,int ll,int rr,int l,int r)
{
if(ll>r||rr<l) return ;
if(!nde) nde=++tot;
val[nde]+=min(r,rr)-max(l,ll)+;
if(ll>=l&&rr<=r)
++laz[nde];
else
{
int mid=(ll+rr)>>;
Insert(lson[nde],ll,mid,l,r);
Insert(rson[nde],mid+,rr,l,r);
}
}
void Add(int l,int r,int v)
{
int nde=,ll=,rr=*n;
while(true)
{
Insert(root[nde],,n,l,r);
if(ll^rr)
{
int mid=(ll+rr)>>;
(v<=mid)?(nde<<=,rr=mid):(nde<<=,nde|=,ll=mid+);
}
else return ;
}
}
long long Query(int nde,int ll,int rr,int l,int r,int lz)
{
if(ll>r||rr<l)
return ;
else if(ll>=l&&rr<=r)
return val[nde]+1ll*lz*(rr-ll+);
else
{
int mid=(ll+rr)>>;
return Query(lson[nde],ll,mid,l,r,lz+laz[nde])+Query(rson[nde],mid+,rr,l,r,lz+laz[nde]);
}
}
int main()
{
register int i;
read1(n),read1(m);
for(i=;i<=m;i++)
{
read1(op);
if(op==)
{
int t1,t2,t3;
read1(t1),read1(t2),read2(t3);
int nde=,ll=,rr=*n; t3=n-t3+;
while(true)
{
Insert(root[nde],,n,t1,t2);
if(!(ll^rr)) break;
int mid=(ll+rr)>>;
(t3<=mid)?(nde<<=,rr=mid):(nde<<=,nde|=,ll=mid+);
}
}
else
{
int t1,t2; long long t4;
read1(t1),read1(t2),read3(t4);
int nde=,ll=,rr=*n;
while(true)
{
if(ll==rr) {write(n-ll+),puts(""); break;}
int mid=(ll+rr)/;
long long qry=Query(root[nde<<],,n,t1,t2,);
(t4<=qry)?(nde<<=,rr=mid):(nde<<=,nde|=,ll=mid+,t4-=qry);
}
}
}
return ;
}
解题:ZJOI 2013 K大数查询的更多相关文章
- [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)
[BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...
- 数据结构(树套树):ZJOI 2013 K大数查询
有几个点卡常数…… 发现若第一维为位置,第二维为大小,那么修改时第一维修改区间,查询时第一维查询区间,必须挂标记.而这种情况下标记很抽象,而且Push_down不是O(1)的,并不可行. 那要怎么做呢 ...
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
- [BZOJ 3110] [ZJOI 2013] K大数查询
Description 有 \(N\) 个位置,\(M\) 个操作.操作有两种,每次操作如果是: 1 a b c:表示在第 \(a\) 个位置到第 \(b\) 个位置,每个位置加入一个数 \(c\): ...
- [ZJOI 2013] K大数查询
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3110 [算法] 整体二分 + 线段树 时间复杂度 : O(NlogN ^ 2) [代 ...
- 洛谷 P3332 [ZJOI2013]K大数查询 解题报告
P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...
- 树套树专题——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: 6050 Solved: 2007[Submit][Sta ...
- 区间K 大数查询
算法训练 区间k大数查询 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列 ...
随机推荐
- openstack系列文章(一)
学习openstack的系列文章-虚拟化 虚拟化 KVM CPU 虚拟化 KVM 内存虚拟化 全虚拟化 I/O 设备 半虚拟化 I/O 设备 I/O PCI PCIe 设备直接分配 SR-IOV 在 ...
- SparkRDD编程实战
通过spark实现点击流日志分析案例 1. 访问的pv package cn.itcast import org.apache.spark.rdd.RDD import org.apache.spar ...
- 搭建 Digital Ocean 服务器
作为程序员,搭建属于自己的服务器可以部署自己的网站,可以配置代理***,了解国际前沿科技:一些高性能的服务器还可以完成一些云计算.深度学习模型的训练任务. DigitalOcean 服务启动 注册 D ...
- go vendor 安装失败的原因分析
安装之前的配置 export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin 1 2 安装 通常,我们查到的安装方法一般是下面这种 go get -u gi ...
- vmware安装androidx86 (FreeBSD) 系统图解
有时候自己手机的一些方面限制的因素,我们需要在电脑上装一个“手机”,来完成我们想要做的事情. 安装步骤如下: 首先需要一个ISO系统镜像,下面地址可以提供大量镜像下载: https://zh.osdn ...
- max number of clients reached Redis测试环境报错
现象:测试服务是去redis循环取数据,早上发现服务挂了,手动登陆redis 无法输入命令,报错:max number of clients reached Redis
- js最简单的动画
$(document).ready(function(){ //�ֶ�����ҳ��Ԫ�� $("#reset").click(function(){ $("*" ...
- 提不起劲想赶紧完工 Scrum Meeting 博客汇总
提不起劲想赶紧完工 Scrum Meeting 博客汇总 一.Alpha阶段 1,第一次Scrum Meeting 2,第二次Scrum Meeting 3,第三次Scrum Meeting 4,第四 ...
- 始入OO课程的殿堂,初识面向对象的奥妙——OO第一次博客总结
当我满怀期待叩开OO的大门,却发现宝藏藏在层层阻难之后 第一次作业 1.度量分析 >关于第一次作业的metrics图分析没有出现标红的McCabe Cyclomatic Complexity或者 ...
- crontab任务不生效
新建php脚本ctTest.php,代码如下: <?php /****************************************************************** ...