Cogs 1345. [ZJOI2013] K大数查询(树套树)
- [ZJOI2013] K大数查询
/*
树套树写法.
bzoj过不了.
可能有负数要离散吧.
线段树套线段树.
外层权值线段树,内层区间线段树维护标记.
对权值建一棵权值线段树.
某个点表示权值在某个范围内的数的个数.
然后对每个点建一棵区间线段树.
表示该权值范围在某个区间的数的个数.
然后查找用类似二分的思想.
*/
#include<iostream>
#include<cstdio>
#define MAXN 50001
using namespace std;
struct data{int lc,rc,sum,size,bj;}tree[MAXN*400];
int n,m,root[MAXN],cut;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void push(int k,int l,int r)
{
if(!tree[k].lc) tree[k].lc=++cut;
if(!tree[k].rc) tree[k].rc=++cut;
tree[tree[k].lc].bj+=tree[k].bj;
tree[tree[k].rc].bj+=tree[k].bj;
int mid=(l+r)>>1;
tree[tree[k].lc].sum+=(mid-l+1)*tree[k].bj;
tree[tree[k].rc].sum+=(r-mid)*tree[k].bj;
tree[k].bj=0;
return ;
}
void add(int &k,int l,int r,int x,int y)
{
if(!k) k=++cut;
if(x==l&&r==y)
{
tree[k].bj++;
tree[k].sum+=r-l+1;
return ;
}
if(tree[k].bj) push(k,l,r);
int mid=(l+r)>>1;
if(y<=mid) add(tree[k].lc,l,mid,x,y);
else if(x>mid) add(tree[k].rc,mid+1,r,x,y);
else add(tree[k].lc,l,mid,x,mid),add(tree[k].rc,mid+1,r,mid+1,y);
tree[k].sum=tree[tree[k].lc].sum+tree[tree[k].rc].sum;
return ;
}
void sloveadd(int x,int y,int z)
//先找到它所在权值的位置然后在[x,y]处加入贡献.
{
int l=1,r=n,k=1,mid;
while(l!=r)
{
mid=(l+r)>>1;
add(root[k],1,n,x,y);
if(z<=mid) r=mid,k=k<<1;
else l=mid+1,k=(k<<1)+1;
}
add(root[k],1,n,x,y);
return ;
}
int query(int k,int l,int r,int x,int y)
{
if(!k) return 0;
if(tree[k].bj) push(k,l,r);
if(x<=l&&r<=y) return tree[k].sum;
int tot=0,mid=(l+r)>>1;
if(x<=mid) tot+=query(tree[k].lc,l,mid,x,y);
if(y>mid) tot+=query(tree[k].rc,mid+1,r,x,y);
return tot;
}
int slovequery(int x,int y,int z)
{
int l=1,r=n,k=1;
while(l!=r)
{
int mid=(l+r)>>1;
int t=query(root[k<<1],1,n,x,y);
if(t>=z) r=mid,k<<=1;
else l=mid+1,k=(k<<1)+1,z-=t;
}
return l;
}
int main()
{
freopen("zjoi13_sequence.in","r",stdin);
freopen("zjoi13_sequence.out","w",stdout);
int k,x,y,z;
n=read(),m=read();
while(m--)
{
k=read(),x=read(),y=read(),z=read();
if(k&1) sloveadd(x,y,n-z+1);
else printf("%d\n",n-slovequery(x,y,z)+1);
}
return 0;
}
Cogs 1345. [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 ...
- 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][ ...
- 【BZOJ3110】[Zjoi2013]K大数查询 树套树
[BZOJ3110][Zjoi2013]K大数查询 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c,如果 ...
随机推荐
- BZOJ3998 TJOI2015弦论(后缀自动机)
先考虑相同子串视为一个.按SAM的拓扑序预处理出从每个节点开始能得到多少个本质不同子串(注意虽然一个节点对应多个子串,但到达该点时当前的子串显然是确定为其中一个的),然后按位贪心即可. 相同子串视为多 ...
- 安装本地jar包
(1)安装在本地maven库 假设我们需要引入的包为 myjar-1.0.jar (1.1)打开cmd,进入myjar-1.0.jar所在的目录 (1.2)执行如下命令:mvn install:ins ...
- IE浏览器 Table 兼容问题
border篇: 直接在<tr>标签上添加 border-bottom:1px solid red; 在IE8以上浏览器有效,IE7以下版本无效 解决方案:需给<table&g ...
- EF6.0中出现未找到具有固定名称“System.Data.SqlClient”的 ADO.NET提供程序的实体框架提供程序解决办法
在多工程项目中,由于EF封装在某一个工程里,那么该项目用于EF相关类库 EntityFramework.dll,以及EntityFramework.SqlServer.dll的引用 那么你一个启动工程 ...
- 笔记 - C#从头开始构建编译器 - 3
视频与PR:https://github.com/terrajobst/minsk/blob/master/docs/episode-03.md 作者是 Immo Landwerth(https:// ...
- Redis 测试 数据类型
- springboot启动流程(二)SpringApplication run方法核心逻辑
所有文章 https://www.cnblogs.com/lay2017/p/11478237.html run方法逻辑 在上一篇文章中,我们看到SpringApplication的静态方法最终是去构 ...
- 结对编程作业(python实现)
一.Github项目地址:https://github.com/asswecanfat/git_place/tree/master/oper_make 二.PSP2.1表格: PSP2.1 Perso ...
- rabbitMQ安装 [linux]
转载 https://blog.csdn.net/qq_22075041/article/details/78855708 安装Erlang 由于RabbitMQ依赖Erlang, 所以需要先安装Er ...
- openpose-opencv 的coco数据多人体姿态估计
介绍 opencv除了支持常用的物体检测模型和分类模型之外,还支持openpose模型,同样是线下训练和线上调用.这里不做特别多的介绍,先把源代码和数据放出来- 实验模型获取地址:https://gi ...