BZOJ5057 : 区间k小值5
整体二分,按时间顺序依次考虑对于权值落在$[l,r]$内的所有操作。
对于每个修改操作,若权值范围完全包含了$[l,r]$,那么在更深层的分治中它都完全包含它,对每个询问的贡献是定值,因此在当前层将贡献及时加给后面的每个询问即可。否则将该修改操作分裂成最多$2$个子操作,并往下递归分治。处理贡献均可以用树状数组实现。
对于每个询问,求出对应区间内部的和,与$k$进行比较,来决定往左还是往右递归。
时间复杂度$O(m\log^2n)$。
#include<cstdio>
#include<vector>
using namespace std;
typedef long long ll;
const int N=30010;
int n,m,i,T;ll e[N][5],pre[N];vector<int>q;
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
struct BIT{
ll a[N],b[N];int v[N];
void modify(int x,ll p){for(int i=x;i<=n;i+=i&-i)if(v[i]<T)v[i]=T,a[i]=p,b[i]=p*(x-1);else a[i]+=p,b[i]+=p*(x-1);}
ll ask(ll x){
ll t0=0,t1=0;
for(int i=x;i;i-=i&-i)if(v[i]==T)t0+=a[i],t1+=b[i];
return x*t0-t1;
}
void add(int x,int y,ll p){modify(x,p),modify(y+1,-p);}
ll sum(int x,int y){return ask(y)-ask(x-1);}
}bit0,bit1;
void solve(int l,int r,vector<int>q){
if(!q.size())return;
if(l==r){
for(int i=0;i<q.size();i++)if(e[q[i]][0]==2)e[q[i]][4]=l;
return;
}
int mid=(l+r)>>1;vector<int>ql,qr;
T++;
for(int i=0;i<q.size();i++){
int x=q[i],A=e[x][1],B=e[x][2],C=e[x][3],D=e[x][4];
if(e[x][0]==1){
if(C<=l&&r<=D)bit0.add(A,B,1);
else{
int c=max(C,l),d=min(D,mid);
if(c<=d)bit1.add(A,B,d-c+1);
if(C<=mid)ql.push_back(x);
if(D>mid)qr.push_back(x);
}
}else{
pre[x]+=bit0.sum(A,B);
ll tmp=pre[x]*(mid-l+1)+bit1.sum(A,B);
if(tmp>=e[x][3])ql.push_back(x);else e[x][3]-=tmp,qr.push_back(x);
}
}
solve(l,mid,ql),solve(mid+1,r,qr);
}
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%lld%lld%lld%lld",&e[i][0],&e[i][1],&e[i][2],&e[i][3]);
if(e[i][0]==1)scanf("%lld",&e[i][4]);
q.push_back(i);
}
solve(1,n,q);
for(i=1;i<=m;i++)if(e[i][0]==2)printf("%lld\n",e[i][4]);
return 0;
}
BZOJ5057 : 区间k小值5的更多相关文章
- 【BZOJ】3065: 带插入区间K小值
http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...
- bzoj 3065: 带插入区间K小值 替罪羊树 && AC300
3065: 带插入区间K小值 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1062 Solved: 253[Submit][Status] Des ...
- bzoj 3065: 带插入区间K小值(分块)
Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它 ...
- [BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树
刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值 ...
- 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树
题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...
- 模板—算法—整体二分(区间k小值)
模板—算法—整体二分(区间k小值) Code: #include <cstdio> #include <algorithm> using namespace std; #def ...
- 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树
题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...
- 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树
[BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...
- 【BZOJ3065】带插入区间k小值
题意: 带插入,修改的区间k小值在线查询 原序列长度<=35000,插入个数<=35000,修改个数<=70000,0<=权值<=70000 题解: Orz vfleak ...
随机推荐
- windows客户端走代理上网
前提:在大型网络中,由于众多服务器及安全性考虑,内网服务器是不能上外网的,但是为了满足某些服务的需要,一定会搭建代理服务器的. 以下是windows客户端走代理服务器的操作: 两下确定就可 ...
- linux 系统备份和恢复
Linux不像windows,它不限制根用户存取任何东西,因此,你完全可以把一个分区上每一个的文件放入一个TAR文件中. 使用root用户切换到根目录 然后,使用下面的命令备份完整的系统: tar c ...
- 如何设置Navicat的显示字体与字体大小?
方法/步骤 打开Navicat 点击[工具]菜单,再选择[选项] 在[选项]界面,点击[外观]下的[字体] 设置网格字体和大小 设置编辑器字体和大小 设置命令列界面字体和大 ...
- Caused by: java.net.ConnectException: Connection refused: master/192.168.3.129:7077
1:启动Spark Shell,spark-shell是Spark自带的交互式Shell程序,方便用户进行交互式编程,用户可以在该命令行下用scala编写spark程序. 启动Spark Shell, ...
- 網管利器!開源管理系統-LibreNMS
https://www.4rbj4.com/442 https://www.ichiayi.com/wiki/tech/librenms
- vue 踩坑记录
1.绑定双击事件用 @dblclick 不要用@ondblclick 在vue中@=on 2.Vue中路由跳转踩坑. 比如我的路由如下定义 routes: [ { path: "/&quo ...
- jquery实时监听输入框值变化
在做web开发时候很多时候都需要即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感.而采用onchange时间又往往是在输入框失去焦点(onblur)时候触发,有时候并不能满足条 ...
- Theorems for existence and uniqueness of variational problem
Introduction Among simulation engineers, it is well accepted that the solution of a PDE can be envis ...
- Python_ collections_defaultdict默认字典
defaultdict(): 默认类型为字典,继承了字典的方法 import collections dic = collections.defaultdict() dic['k1'] = 'hell ...
- get、post的区别
Get.post请求的区别 前言 不论是get还是post方式,都是属于http协议,只是http的两种不同的传输方式,而http协议是基于TCP传输协议的,所以无论是get还是post,在传输层的意 ...