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大的数 ...
随机推荐
- 解决Oracle数据库空间不足问题
//查询表空间的大小以及文件路径地址select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_space ...
- SpringCloud Hystrix熔断之线程池
服务熔断 雪崩效应:是一种因服务提供者的不可用导致服务调用者的不可用,并导致服务雪崩的过程. 服务熔断:当服务提供者无法调用时,会通过断路器向调用方直接返回一个错误响应,而不是长时间的等待,避免服务雪 ...
- Ubuntu---gcc && g++
摘要:今天用 gcc 编译 c++ 代码,发现会报错:std::cout 这个函数无定义,所以决定查一下原因,在这里总结一下,虽然以后回头看一定会觉得太菜,但是新手期还是总要经历的一个阶段,所以就记 ...
- poj 1141 Brackets Sequence 区间dp,分块记录
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35049 Accepted: 101 ...
- [leetcode]66. Plus One加一
Given a non-empty array of digits representing a non-negative integer, plus one to the integer. The ...
- 理解javascript中的立即执行函数(function(){})()
之前看了好多代码,都有用到这种函数的写法,但是都没认真的去想为什么会这样写,今天开始想学习下jquery的源码,发现jquery也是使用这种方式,用(function(window, undefine ...
- SQL Server 2000服务器安装剖析
一.情况说明 sql server 2000以前的版本,例如7.0一般不存在多个版本,只有标准版跟桌面版,用户如果不清楚该装什么版本的话,可按安装上的安装先决条件指示安装,一般在WIN2000 服务器 ...
- freemarker使用
获得FreeMarker 官网:http://freemarker.org/ 中文帮助文档:https://sourceforge.net/projects/freemarker/files/chin ...
- Python读取excel表的数据
from openpyxl.reader.excel import load_workbook #读取xlsx文件def readExcelFile(path): dic={} #打开文件 file= ...
- sqoop mysql导入hive 数值类型变成null的问题分析
问题描述:mysql通过sqoop导入到hive表中,发现有个别数据类型为int或tinyint的列导入后数据为null.设置各种行分隔符,列分隔符都没有效果. 问题分析:hive中单独将有问题的那几 ...