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 ...
随机推荐
- java程序-类的高级特性
创建Employee类,在类中定义三个属性:编号,姓名,年龄,然后在构造方法里初始化这三个属性,最后在实现接口中的定义的CompareTo方法,将对象按编号升序排列. 代码如下:(程序可能有些错误,方 ...
- 洛谷 P2668 斗地主
毒瘤题目,搞了三天-- 也没什么好讲的,就是纯搜索,先搜顺子,再搜其他的,最后单张牌和对子的时候,就不要搜索了,直接枚举,不然会T飞掉多么痛的领悟-- 主要还是靠码力 #include<iost ...
- apache 报413
http://www.hostlift.com/apache/modsecurity-request-body-content-length-is-larger-than-the-configured ...
- DOM事件总结
1.DOM事件: DOM0: element.onclick=function(){} DOM2: element.addEventListener(‘click’,function(){}) add ...
- mysql5.6.35源码安装记录
mysql数据库源码安装: 源码地址:wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.xx.tar.gz #安装前准备, ...
- 使Linux支持exFAT和NTFS格式的磁盘
Linux支持exFAT和NTFS Linux系统默认可以自动识别到fat32格式的盘,但fat32支持的文件不能大于4G,所以只能将移动硬盘和U盘格式化为NTFS和exFAT这两种格式的,对于U盘最 ...
- Vue—事件修饰符
Vue事件修饰符 Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节,如:event.preventDefault() 或 event.stopPropagation(). Vue. ...
- python动态添加属性和方法
---恢复内容开始--- python动态添加属性: class Person(object): def __init__(self,newName,newAge): self.name = newN ...
- 面试Python工程师,这几道编码题有必要背背,Python面试题No8
第1题:列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]. map是python高阶用法,字面意义是映射,它的 ...
- solr 日志配置
配置Solr日志记录 临时记录设置 您可以使用Admin Web界面来控制Solr中的日志输出量.选择LOGGING链接.请注意,此页面只允许您更改正在运行的系统中的设置,并不会保存在下一次运行中 ...