【bzoj 3110】[Zjoi2013]K大数查询
Description
有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c。如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。
Input
第一行N,M。
接下来M行,每行形如1 a b c或2 a b c。
Output
输出每个询问的结果。
Sample Input
2 5
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3
Sample Output
1
2
1
HINT
【样例说明】
第一个操作 后位置 1 的数只有 1 , 位置 2 的数也只有 1 。 第二个操作 后位置 1的数有 1 、 2 ,位置 2 的数也有 1 、 2 。 第三次询问 位置 1 到位置 1 第 2 大的数 是1 。 第四次询问 位置 1 到位置 1 第 1 大的数是 2 。 第五次询问 位置 1 到位置 2 第 3大的数是 1 。
N,M<=50000,N,M<=50000,a<=b<=N,1操作中abs(c)<=N,2操作中c<=Maxlongint。
整体二分裸题……顺便可以了解一下用树状数组实现区间加和区间求和操作。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define LL long long
using namespace std;
const int N=1e5+;
int n,m,qid,mx,ans[N];
LL tr[N][];
bool f[N];
struct node{int op,l,r,c,id;}a[N],tmp[N];
LL read()
{
LL x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int lowbit(int x){return x&(-x);}
void add(int x,LL c,int id){while(x<=n)tr[x][id]+=c,x+=lowbit(x);}
void insert(int id,LL c){add(id,c,);add(id,c*id,);}
LL query(int x,int id){LL ans=;while(x)ans+=tr[x][id],x-=lowbit(x);return ans;}
LL ask(int id){LL ans=(id+)*query(id,)-query(id,);return ans;}
void work(int x,int y,int l,int r)
{
if(l==r){for(int i=x;i<=y;i++)if(a[i].op==)ans[a[i].id]=l;return;}
int h1=x,h2=x,mid=(l+r)>>;
for(int i=x;i<=y;i++)
if(a[i].op==)
{
LL temp=ask(a[i].r)-ask(a[i].l-);
if(temp<a[i].c)f[i]=false,a[i].c-=temp;
else f[i]=true,h2++;
}
else if(a[i].c<=mid)insert(a[i].l,),insert(a[i].r+,-),f[i]=true,h2++;
else f[i]=false;
for(int i=x;i<=y;i++)if(a[i].op==&&a[i].c<=mid)insert(a[i].l,-),insert(a[i].r+,);
for(int i=x;i<=y;i++)if(f[i])tmp[h1++]=a[i];else tmp[h2++]=a[i];
for(int i=x;i<=y;i++)a[i]=tmp[i];
work(x,h1-,l,mid);work(h1,y,mid+,r);
}
int main()
{
n=read();m=read();
for(int i=;i<=m;i++)
{
a[i].op=read();a[i].l=read();a[i].r=read();a[i].c=read();
if(a[i].op==)a[i].c=n-a[i].c+,mx=max(mx,a[i].c);
else a[i].id=++qid;
}
work(,m,,mx);
for(int i=;i<=qid;i++)printf("%d\n",n-ans[i]+);
return ;
}
【bzoj 3110】[Zjoi2013]K大数查询的更多相关文章
- 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][ ...
- BZOJ 3110 [Zjoi2013]K大数查询(整体二分)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 11654 Solved: 3505[Submit][St ...
- [BZOJ 3110] [Zjoi2013] K大数查询 【树套树】
题目链接: BZOJ - 3110 题目分析 这道题是一道树套树的典型题目,我们使用线段树套线段树,一层是区间线段树,一层是权值线段树.一般的思路是外层用区间线段树,内层用权值线段树,但是这样貌似会很 ...
- BZOJ 3110 [Zjoi2013]K大数查询 (CDQ分治+树状数组)
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...
- bzoj 3110 [Zjoi2013]K大数查询——线段树套线段树(标记永久化)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3110 第一道线段树套线段树! 第一道标记永久化! 为什么为什么写了两个半小时啊…… 本想线段 ...
- BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)
题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...
随机推荐
- django rest framework mixins
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXQAAAEZCAIAAAAIa0mAAAAU/0lEQVR4nO2d247cxoGG5y3yKH6AAf
- 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)
链接:https://ac.nowcoder.com/acm/contest/392/F来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536K ...
- Pycharm For Linux
之前说过JetBrains系列的破解方式:https://www.cnblogs.com/dunitian/p/8478252.html 现在说下怎么固定到任务栏,速度版 详细讲解可以看之前说安装微信 ...
- 使用ajax实现前后端是数据交互
ajax的概念 ajax一个前后台配合的技术,它可以让javascript发送http请求,与后台通信,获取数据和信息.ajax技术的原理是实例化xmlhttp对象,使用此对象与后台通信.jquery ...
- 使用Docker Swarm搭建分布式爬虫集群
https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653195618&idx=2&sn=b7e992da6bd1b2 ...
- 纪中2018暑假培训day3提高a组改题记录(混有部分b组)
day3 模拟赛,看了看a组题,发现是博弈论,非常开心(因为好玩),于是做的a组.结果差点爆零,死命纠结t1的sg函数,但其实只是一个dp,不用扯到sg函数的那种. t1: Description 被 ...
- P1637 三元上升子序列
thair 好,这个naive的东西因为只有三元,很好求解.只要把每个数之前小的L[i]与之后大的R[i]求一下即可. 求两次逆序对即可.那么答案便是∑(L[i]*R[i]); 对于更高元的,胡雨菲写 ...
- python3安装pycurl
centos7安装pycurl 出现错误 FileNotFoundError: [Errno 2] No such file or directory: 'curl-config'ImportErro ...
- react-native中的请求数据
很多移动应用都需要从远程地址中获取数据或资源.你可能需要给某个 REST API 发起 POST 请求以提交用户数据,又或者可能仅仅需要从某个服务器上获取一些静态内容. 使用 Fetch React ...
- numpy的使用方法
一.numpy快速入门 1.什么是numpy: numpy是python的一个矩阵类型,提供了大量矩阵处理的函数,非正式来说,就是一个使运算更容易,执行更迅速的库,因为它的内部运算是通过c语言而不是p ...