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,如果 ...
随机推荐
- react以组件为中心的代码分割和懒加载
背景 随着项目越来越复杂,功能够越来越多,JS单个文件就会比较臃肿,js代码拆分显得必不可少. Js文件拆分主要分为按照路由进行js拆分.按照组件进行js拆分. 按照路由拆分:因为本项目请求路径得原因 ...
- 14-MySQL DBA笔记-运维技巧和常见问题处理
第14章 运维技巧和常见问题处理 DBA的成长,离不开对各种问题的处理.本章将为读者介绍一些运维技巧和常见问题的处理方法.我们需要意识到,别人的经验代替不了自己的经验,所以,多实践.多处理问题,最终会 ...
- 【转载】Java枚举的使用
枚举类型可以取代以往常量的定义方式,即将常量封装在类或接口中.此外,枚举类型还提供了安全检查功能.枚举类型本质上还是以类的形式存在. 1.使用枚举类型设置常量以往设置常量,通常将常量放置在接口中,这样 ...
- Android 集成 支付宝支付
调用代码: ALiPayUtil.pay(getActivity(), new ALiPayUtil.PayResponse() { @Override public void success(Pay ...
- GDB数据库SQL操作平台
GDB数据库SQL操作平台 开发本软件的初衷:由于计算数据库要素层属性的时候,涉及到要计算多个字段,或者要根据代码计算名称,得一个一个的筛选并计算,过程比较繁琐,于是就想能不能通过像处理SQLServ ...
- 2、Java基础:概念
1.面向对象和面向过程的区别 面向过程 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发,性能是最重要的因素 ...
- 安装window、linux双系统
一.安装windows,从主硬盘中分出40G空间: 二.下载linux ios镜像; 三.安装UltraISO,把下载好的linux镜像写入u盘: ‘写入硬盘镜像’->写入方式‘usb-HDD+ ...
- CVE-2018-2879 - anniversary
For the anniversary of the discovery of CVE-2018-2879 by Sec Consult (https://sec-consult.com/en/blo ...
- linux内存管理初学
虚拟内存模型 Linux 内核本身并不运行在虚拟空间中,其使用的是物理寻址模式. 物理内存被分割为界面,一个内存页面的大小由PAGE_SIZE宏决定. 虚拟地址空间的方式使程序员可以将巨大的结构用于连 ...
- ubuntu创建kvm虚拟机
CPU虚拟化支持 [root@ubuntu~]# egrep -o '(vmx|svm)' /proc/cpuinfo vmx vmx vmx vmx KVM环境 [root@ubuntu ~]# a ...