整体二分,按时间顺序依次考虑对于权值落在$[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的更多相关文章

  1. 【BZOJ】3065: 带插入区间K小值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...

  2. bzoj 3065: 带插入区间K小值 替罪羊树 && AC300

    3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1062  Solved: 253[Submit][Status] Des ...

  3. bzoj 3065: 带插入区间K小值(分块)

    Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它 ...

  4. [BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树

    刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值 ...

  5. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树

    题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...

  6. 模板—算法—整体二分(区间k小值)

    模板—算法—整体二分(区间k小值) Code: #include <cstdio> #include <algorithm> using namespace std; #def ...

  7. 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树

    题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...

  8. 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树

    [BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...

  9. 【BZOJ3065】带插入区间k小值

    题意: 带插入,修改的区间k小值在线查询 原序列长度<=35000,插入个数<=35000,修改个数<=70000,0<=权值<=70000 题解: Orz vfleak ...

随机推荐

  1. ubuntu16.04安装skype

    ubuntu16.04安装skype 一句命令搞定 wget https://repo.skype.com/latest/skypeforlinux-64.deb && sudo dp ...

  2. Android之Error: 'L' is not a valid file-based resource name character解决办法

    1.问题 Error:Execution failed for task ':mergeBYODReleaseResources'.> /home/chenyu/Android_dev/sang ...

  3. 为tomcat8安装Native library

    安装依赖包 yum install -y cmake gcc expat-devel perl wget 安装apr wget http://mirrors.hust.edu.cn/apache//a ...

  4. maven依赖jar导出消失问题

      问题:maven依赖jar导出消失问题 新创新的Maven管理的项目,使用的模板是maven-archetype-quickstart,设置maven管理的jar导出时,如下 在每次”update ...

  5. [转] Immutable 常用API简介

    本文主要整理了Immutable.js常用API的使用. Immutable 是什么? 关于Immutable的定义,官方文档是这样说的: Immutable data encourages pure ...

  6. [Bjoi2018]二进制

    题解: 首先发现性质 只有1个1的区间 或者 奇数个1且0的个数少于2这个区间是不合法的 然后这个东西暴力是比较好处理的 刚开始写的比较傻逼,分几种情况 先把0,1缩在一起 1.k1个0+1+k2个0 ...

  7. 【bzoj4976】宝石镶嵌

    题解: 比较水 注意k<=100这个条件 当n-k比较大的时候 我们显然会把它有的位都给取了 不然的话我们可以考虑dp 暴力状压就可以了 代码: #include <bits/stdc++ ...

  8. [转]centos安装autossh

    centos安装autossh $ sudo yum install wget gcc make$ wget http://www.harding.motd.ca/autossh/autossh-1. ...

  9. ab访问并发测试简要步骤

    工具: 1)ab -n 总访问次数  -c 并发用户数  目标url   查询某一个工具是哪个软件包安装的 rpm -qf 2)loadrunner 可视化 3)webbench 制作指定大小页面: ...

  10. eclipse启动web应用 报错

    错误:The origin server did not find a current representation for the target resource or is not willing ...