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,如果 ...
随机推荐
- 原生js分页器插件
window.page = function page(ele, para) { this.ele = document.querySelector(ele); this.options = { co ...
- WebAPI 笔记
一.基本配置 1. 全局配置 Global.asax public class WebApiApplication : System.Web.HttpApplication { protected v ...
- tint2
#---------------------------------------------# TINT2 CONFIG FILE#---------------------------------- ...
- Go part 4 数据容器(数组,slice,string,map,syncMap,list)
数组 数组是值类型,因此改变副本的值,不会影响到本身 数组的定义:var 变量名 [元素数量] T 变量名(符合标识符要求即可) 元素数量(整型,可以是const中的值) T(可以是任意基本类型,包括 ...
- JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用
jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default Lambda表达式 L ...
- FlowPortal BPM流程中调用封装好的API如何调试
遇到复杂一点的业务,我们常常都会将业务逻辑封装到一个dll中,在流程中调用封装好的API. 业务逻辑库封装到企业库后,是可以在Visual Studio中调试库的哦. [附加到进程] [流程中调用AP ...
- 3.ConcurrentHashMap 锁分段机制 Copy-On-Write
/*ConcurrentHashMap*/ Java 5.0 在 java.util.concurrent 包中提供了 多种 并发容器来改进同步容器的性能 ConcurrentHashMap 同步容器 ...
- 一段代码显示出电脑连过所有wifi的密码
1.打开运行 2.输入cmd后回车 3.输入如下代码 for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show pro ...
- Windows下计算md5值
目录 Windows下计算md5值 1.linux 下计算md5值 2.Windows下计算md5值 Windows下计算md5值 1.linux 下计算md5值 [root@master yl]# ...
- Java发送email的端口问题
Could not connect to SMTP host: smtp.***.com, port: 465, response: -1 使用Java发送email 的端口问题.一般使用25端口即可 ...