整体二分,按时间顺序依次考虑对于权值落在$[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. POJ 1002 487-3279(字典树/map映射)

    487-3279 Time Limit: 2000MS        Memory Limit: 65536K Total Submissions: 309257        Accepted: 5 ...

  2. 20165206 2017-2018-2 《Java程序设计》第8周学习总结

    20165206 2017-2018-2 <Java程序设计>第8周学习总结 教材学习内容总结 进程:进程是程序的一次动态执行过程,对应了从代码加载.执行至执行完毕的一个完整过程,这个过程 ...

  3. win10下右键菜单添加“打开cmd”

    早期版本的win10是可以在文件夹的左上角打开cmd的,更新后发现现在只有powershell能用了.这不方便. 通过修改注册表,可以实现这个功能. 具体做法:新建一个.reg文件win10_add_ ...

  4. SQL Server等待

    等待大概分为3类:资源等待.队列等待.外部等待 过滤掉系统相关的等待类型的语句.(查看常用的等待信息) SELECT wait_type , signal_wait_time_ms , wait_ti ...

  5. 在th中显示图片

    从DataTable中获取值: foreach (DataRow dr in ((DataTable)ViewBag.bookInfoList).Rows) { <tr> <th c ...

  6. DapperHelper 帮助类

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  7. Temporal Action Detection with Structured Segment Networks (ssn)【转】

    Action Recognition: 行为识别,视频分类,数据集为剪辑过的动作视频 Temporal Action Detection: 从未剪辑的视频,定位动作发生的区间,起始帧和终止帧并预测类别 ...

  8. ionic 3 build后图片无法显示

    运行命令 ionic cordova build android 生成了android-debug.apk. /home/han/project/zero_app/platforms/android/ ...

  9. Centos6.5系统压力测试过程大量TIME_WAIT

    统计tcp状态的命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' netstat -n | awk '/ ...

  10. ELK+Redis+Nginx服务数据存储以及Nginx日志的收集

    PS:此片文章是承接上篇ELK部署文档,再次便不详细说明了 [安装Redis] [root@Redis ~]# wget  http://download.redis.io/releases/redi ...