K大数查询(bzoj 3110)
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
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3
Sample Output
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
/*
动态第K大,整体二分的经典题目。
思想和静态的是差不多的,即二分出答案之后用树状数组判断,但是这个题目树状数组用了两个,就不是很懂了。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lon long long
#define N 50010
using namespace std;
lon n,m,c1[N],c2[N],ans[N],has[N];
struct node{
lon l,r,c,tp,id;
};node a[N],q[N];
void add(lon *c,lon i,lon b){
for(;i<=n;i+=i&(-i))
c[i]+=b;
}
lon sum(lon *c,lon i){
lon r=;
for(;i;i-=i&(-i))
r+=c[i];
return r;
}
void modify(lon l,lon r,lon c){
add(c1,l,c);add(c1,r+,-c);
add(c2,l,-c*(l-));add(c2,r+,c*r);
}
lon pre(lon i){
if(!i)return ;
return sum(c1,i)*i+sum(c2,i);
}
lon query(lon l,lon r){
return pre(r)-pre(l-);
}
void solve(lon head,lon tail,lon l,lon r){
if(head>tail) return;
if(l==r){
for(lon i=head;i<=tail;i++)
if(a[i].tp==) ans[a[i].id]=l;
return;
}
lon mid=l+r>>;
lon l1=head,l2=tail;
for(lon i=head;i<=tail;i++){
if(a[i].tp==){
if(a[i].c<=mid) q[l1++]=a[i];
else q[l2--]=a[i],modify(a[i].l,a[i].r,);
}
else {
lon cnt=query(a[i].l,a[i].r);
if(cnt<a[i].c){
a[i].c-=cnt;
q[l1++]=a[i];
}
else q[l2--]=a[i];
}
}
reverse(q+l2+,q+tail+);
for(lon i=head;i<=tail;i++){
a[i]=q[i];
if(a[i].tp==&&a[i].c>mid)
modify(a[i].l,a[i].r,-);
}
solve(head,l1-,l,mid);
solve(l1,tail,mid+,r);
}
int main(){
scanf("%lld%lld",&n,&m);
for(lon i=;i<=m;i++){
scanf("%lld%lld%lld%lld",&a[i].tp,&a[i].l,&a[i].r,&a[i].c);
a[i].id=i;
if(a[i].tp==) has[i]=;
}
solve(,m,,n);
for(lon i=;i<=m;i++)
if(has[i])printf("%lld\n",ans[i]);
return ;
}
K大数查询(bzoj 3110)的更多相关文章
- K大数查询 BZOJ 3110
K大数查询 [问题描述] 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- 【ZJOI2013】k大数查询 BZOJ 3110
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ 3110 K大数查询 | 整体二分
BZOJ 3110 K大数查询 题面 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个 ...
- [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)
[BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有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][ ...
- BZOJ 3110 [Zjoi2013]K大数查询(整体二分)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 11654 Solved: 3505[Submit][St ...
随机推荐
- 51nod 1174 区间中最大的数(送盾题)
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. ...
- HTTPs与HTTP的性能
(参考:https://blog.csdn.net/chinafire525/article/details/78911734 https://blog.csdn.net/hherima/articl ...
- 怎么在webstorm中设置代码模板
大家都知道webstorm对程序员来说是一个很好用的IDE.我们输入几个关键字,webstorm就会给出提示,大大提高了我们的开发效率,可有时候webstorm的默认设置不能满足我们的个性化代码模板的 ...
- 2890: C--去掉+86
2890: C--去掉+86 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 210 Solved: 91[Submit][Status][Web Bo ...
- Java的jdbc调用SQL Server存储过程Bug201906131120
如果要查询结果,第一行使用set nocount on;可能可以解决问题.
- 洛谷 P3958 奶酪
谨以此题来纪念我爆炸的NOIp2017 这个题虽然很多人说是并查集,但是搜索也是毫无压力的,考场搜索细节写挂,爆了个不上不下的80分.今天无意看到这道题,终于AC 首先这道题要考虑一下精度问题,虽然出 ...
- makeObjectsPerformSelector用法
亲测 makeObjectsPerformSelector 的用法. - (void)makeObjectsPerformSelector:(SEL)aSelector NS_SWIFT_UNAVAI ...
- Codeforces Round #510 #C Array Product
http://codeforces.com/contest/1042/problem/C 给你一个有n个元素序列,有两个操作:1,选取a[i]和a[j],删除a[i],将$a[i]*a[j]$赋值给a ...
- [CODEVS] 2189 数字三角形W
数字三角形 要求走到最后mod 100最大 可达性DP(好像是这样叫) 用bool数组f[i][j][k]表示 位置(i,j)能否得到k(mod 100意义下) 转移条件 f[i][j][k]=f[i ...
- Centos7下安装iptables防火墙
说明:centos7默认使用的firewalld防火墙,由于习惯使用iptables做防火墙,所以在安装好centos7系统后,会将默认的firewall关闭,并另安装iptables进行防火墙规则设 ...