bzoj3110(整体二分)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
typedef long long ll;
int n,m;
struct bit{
ll tr[maxn];
void add(int pos,ll v){
for(int i=pos;i<maxn;i+=i&(-i))tr[i]+=v;
}
ll qs(int pos){
ll res=;
for(int i=pos;i;i-=i&(-i))res+=tr[i];
return res;
}
}A,B;
void update(int l,int r,ll v){
A.add(r,v*r);A.add(l-,-v*(l-));
B.add(r,v);B.add(l-,-v);
}
ll query(int l,int r){
ll tt1=(B.qs(n+)-B.qs(r))*r+A.qs(r);
ll tt2=(B.qs(n+)-B.qs(l-))*(l-)+A.qs(l-);
return tt1-tt2;
}
struct ope{
int id,op,a,b;
ll c;
}t[maxn],tmp1[maxn],tmp2[maxn],tt[maxn];
ll C;
int ans[maxn];
void solve(int l,int r,int L,int R){//L和R是当前二分的答案,l和r是当前区间;
if(l>r)return;
//cout<<l<<' '<<r<<endl;
if(L==R){
for(int i=l;i<=r;++i){
if(t[i].op==)ans[t[i].id]=L;
}
return;
}
int mid=L+R>>;
int t1=,t2=;//注意这里设局部变量;
for(int i=l;i<=r;++i){
if(t[i].op==){
if(t[i].c>mid){
update(t[i].a,t[i].b,);
tmp2[++t2]=t[i];
}
else tmp1[++t1]=t[i];
}
else{
ll cc=query(t[i].a,t[i].b);
//cout<<t[i].a<<' '<<t[i].b<<' '<<cc<<endl;
if(cc>=t[i].c)tmp2[++t2]=t[i];
else {
tmp1[++t1]=t[i];tmp1[t1].c-=cc;
}
}
}
for(int i=l;i<=r;++i){
if(t[i].op==){
if(t[i].c>mid)update(t[i].a,t[i].b,-);
}
}
for(int i=;i<=t1;++i)t[l+i-]=tmp1[i];
for(int i=;i<=t2;++i)t[l+i+t1-]=tmp2[i];
//cout<<l<<' '<<r<<endl;
/*cout<<l<<' '<<l+t1-1<<' '<<L<<' '<<mid<<endl;
cout<<l+t1<<' '<<r<<' '<<mid+1<<' '<<R<<endl;
cout<<endl;*/
solve(l,l+t1-,L,mid);solve(l+t1,r,mid+,R);
}
int main(){
cin>>n>>m;
for(int i=;i<=m;++i){
t[i].id=i;
scanf("%d%d%d%lld",&t[i].op,&t[i].a,&t[i].b,&t[i].c);
t[i].a++;t[i].b++;
C=max(C,t[i].c);
}
for(int i=;i<=m;++i)tt[i]=t[i];
solve(,m,,C);
for(int i=;i<=m;++i)
if(tt[i].op==)printf("%d\n",ans[i]);
return ;
}
bzoj3110(整体二分)的更多相关文章
- 【BZOJ3110】K大数查询(整体二分)
[BZOJ3110]K大数查询(整体二分) 题面 BZOJ 题解 看了很久整体二分 一直不知道哪里写错了 ... 又把树状数组当成线段树区间加法来用了.. 整体二分还是要想清楚在干什么: 我们考虑第\ ...
- BZOJ3110 [Zjoi2013]K大数查询 树套树 线段树 整体二分 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3110 题意概括 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位 ...
- 【BZOJ3110】K大数查询(权值线段树套线段树+标记永久化,整体二分)
题意:有N个位置,M个操作.操作有两种,每次操作 如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...
- 【BZOJ3110】[ZJOI2013]K大数查询(整体二分)
题目: BZOJ3110 分析: 整体二分模板题-- 先明确一下题意:每个位置可以存放多个数,第一种操作是"加入 (insert) "一个数而不是"加上 (add) &q ...
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- [BZOJ3110][ZJOI2013]K大数查询(整体二分)
BZOJ Luogu sol 整体二分,其实很简单的啦. 对所有询问二分一个答案mid,把所有修改操作中数字大于mid的做一个区间覆盖(区间加1) 查询就是区间查询 然后左右分一分即可 注意是第k大 ...
- BZOJ3110:[ZJOI2013]K大数查询(整体二分)
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- 【BZOJ-3110】K大数查询 整体二分 + 线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6265 Solved: 2060[Submit][Sta ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
随机推荐
- 通过ajax返回值
通过ajax获取数据 然后使用 在console.log可以得到值 但是 返回值的在另一个ajax却没有结果为空 百度了一下 才发现少加了这句话 这样同步就可以正常使用了
- IDEA添加项目依赖(将Tomcat中的servlet-api.jar添加到项目中去)
File -> project structure -> Modules -> 右侧Dependencies -> 然后点加号把配置好的Tomcat的依赖包加进去
- Laravel 学习笔记
1. 简介 2. 运行环境要求 2.1 PHP版本 >= 5.5.9 2.2 Mcrypt PHP 扩展 --------------------------php的加密扩展,提供多种加密算法 ...
- Opencv-Python学习笔记(一)
学习和研究计算机视觉,必然绕不开OpenCV. 于是我下载了它的C++源码,用cmake编译遇到一些错误. 然后结合网上一些帖子看源码看了好几天,发现有点不知从何处入手. 于是准备从其python版本 ...
- 用python计算圆周率Π
一.要求: 1.计算到圆周率后面越多位越好. 2.用进度条显示计算的进度. 3.要求给出圆周率Π的具体计算方法和解释. 二.算法: 1.拉马努金公式: 2.高斯-勒让德公式: 设置初始值: 反复执行以 ...
- Mac终端中输入ps aux显示全部进程
ps命令是Process Status的缩写. ps aux命令用来列出系统中当前运行的那些进程. ps aux | grep chrome 表示查询关于chrome的所有程序(grep可作为文件内的 ...
- android 6.0+ 动态权限 拒绝不再询问后跳转设置应用详情页面
android 6.0+ 的权限 需要动态申请 这里的权限针对的是 敏感权限: SMS(短信) SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEI ...
- Cannot attach medium 'D:\program\VirtualBox\VBoxGuestAdditions.iso' {}: medium is already associated with the current state of machine uuid {}返回 代码: VBOX_E_OBJECT_IN_USE (0x80BB000C)
详细的错误信息如下: Cannot attach medium 'D:\program\VirtualBox\VBoxGuestAdditions.iso' {83b35b10-8fa2-4b81-8 ...
- C语言编写程序计算圆上的点的坐标
Problem Description There is a cycle with its center on the origin. Now give you a point on the cycl ...
- 《C++实践之路.pdf》源码
> 源码下载方法 < >> 打开微信 >> 扫描下方二维码 >> 关注林哥私房菜 >> 输入对应编号获取百度网盘提取密码 全书源码[已更新完 ...