浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html

题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=3110

BZOJ1901,不过是把单点修改区间询问改成区间修改区间询问罢了。

我怕会\(TLE\),就用了区间修改区间询问的树状数组。如果还不会这个的,可以去看看这篇博客

时间复杂度:\(O(mlog^2n)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
using namespace std;
typedef long long ll;
#define low(i) ((i)&(-(i))) const int maxn=5e4+5; bool bo[maxn];
int ans[maxn];
int n,m,ans_cnt; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct Oper {
int opt,l,r,k,id;
}p[maxn],tmp[maxn]; struct tree_array {
ll c[maxn]; void add(int pos,int v) {
if(!pos)return;
for(int i=pos;i<=n;i+=low(i))
c[i]+=v;
} ll query(int pos) {
ll res=0;
for(int i=pos;i;i-=low(i))
res+=c[i];
return res;
}
}T1,T2; ll ask(int pos) {
return 1ll*(pos+1)*T1.query(pos)-T2.query(pos);
} void solve(int l,int r,int st,int ed) {
if(ed<st)return;
if(l==r) {
for(int i=st;i<=ed;i++)
if(p[i].id)ans[p[i].id]=l;
return;
}
int mid=(l+r)>>1,cnt=0;
for(int i=st;i<=ed;i++)
if(p[i].opt==1) {
if(p[i].k>mid) {
bo[i]=0;
T1.add(p[i].l,1),T1.add(p[i].r+1,-1);
T2.add(p[i].l,p[i].l),T2.add(p[i].r+1,-1-p[i].r);
}
else bo[i]=1,cnt++;
}
else {
ll res=ask(p[i].r)-ask(p[i].l-1);
if(res>=p[i].k)bo[i]=0;
else bo[i]=1,p[i].k-=res,cnt++;
}
for(int i=st;i<=ed;i++)
if(p[i].opt==1&&p[i].k>mid) {
T1.add(p[i].l,-1),T1.add(p[i].r+1,1);
T2.add(p[i].l,-p[i].l),T2.add(p[i].r+1,p[i].r+1);
}
int ED=st,ST=st+cnt;
for(int i=st;i<=ed;i++)
if(bo[i])tmp[ED++]=p[i];
else tmp[ST++]=p[i];
for(int i=st;i<=ed;i++)
p[i]=tmp[i];
solve(l,mid,st,ED-1),solve(mid+1,r,ED,ed);
} int main() {
n=read(),m=read();
for(int i=1;i<=m;i++) {
p[i].opt=read(),p[i].l=read(),p[i].r=read(),p[i].k=read();
if(p[i].opt==2)p[i].id=++ans_cnt;
}
solve(1,n,1,m);
for(int i=1;i<=ans_cnt;i++)
printf("%d\n",ans[i]);
return 0;
}

BZOJ3110:[ZJOI2013]K大数查询(整体二分版)的更多相关文章

  1. BZOJ3110:[ZJOI2013]K大数查询(整体二分)

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  2. 【BZOJ-3110】K大数查询 整体二分 + 线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6265  Solved: 2060[Submit][Sta ...

  3. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

  4. P3332 [ZJOI2013]K大数查询 整体二分

    终于入门整体二分了,勉勉强强算是搞懂了一个题目吧. 整体二分很多时候可以比较好的离线处理区间\(K\)大值的相关问题.考虑算法流程: 操作队列\(arr\),其中有询问和修改两类操作. 每次在答案的可 ...

  5. BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]

    有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...

  6. BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)

    题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...

  7. [ZJOI2013]K大数查询——整体二分

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是: 1 a b c:表示在第a个位置到第b个位置,每个位置加上一个数c 2 a b c:表示询问从第a个位置到第b个位置,第C大的数是多少. ...

  8. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

  9. BZOJ 3110 [ZJOI2013]K大数查询 (整体二分+线段树)

    和dynamic rankings这道题的思想一样 只不过是把树状数组换成线段树区间修改,求第$K$大的而不是第$K$小的 这道题还有负数,需要离散 #include <vector> # ...

随机推荐

  1. 蓝牙固件升级(OTA升级)原理设计

    转:http://blog.csdn.net/yueqian_scut/article/details/50849033 固件空中升级(OTA)与固件二次引导的原理和设计 原创 2016年03月10日 ...

  2. Android LCD(二):常用接口原理篇【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/9125799 关键词:Android LCD TFT TTL(RGB)  LVDS  E ...

  3. maven setting.xml 存放位置导致deply失败,显示没有权限401错误

    settings.xml存在于两个地方: 1.安装的地方:$M2_HOME/conf/settings.xml 2.用户的目录:${user.home}/.m2/settings.xml 我只在mav ...

  4. 元素 "context:component-scan" 的前缀 "context" 未绑定的解决方案

    在动态web项目(Dynamic Web Project)中,使用SpringMVC框架,新建Spring的配置文件springmvc.xml,添加扫描控制器 <context:componen ...

  5. Apache Phoenix的Array类型

    Apache Phoenix支持JDBC ARRAY类型,任何原生的数据类型就可以在ARRAY中使用.下面我介绍一下在创建的表中使用ARRAY类型. 先看一下创建表的SQL语句: CREATE TAB ...

  6. 分布式技术 webservice

    web service 是一个平台独立的.低耦合的.自包含的.基于编程的web的应用程序,可使用开发的XML(标准通用标记语言下的一个字表)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布 ...

  7. python使用笔记

    修改文件模板,支持中文. File -> Settings -> Editor -> File and Code templates -> python Scropt 在里面加 ...

  8. 分享知识-快乐自己:Spring_IOC(控制反转)详解

    IoC是什么: 1):Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想. 2):在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的 ...

  9. c、rust、golang、swift性能比较

    mac 计算速度视觉判断是(由好到差):c > rust > swift > golang 内存开销在mac上是(由好到差):c > rust > golang > ...

  10. Unity 3D 离线协议

    在联网状态下,获得离线协议,然后导入到Untiy的协议管理器里. 以后在断网的情况下,也能离线使用Unity. 步骤: 1.生成 Request 文件.(Unity_v5.3.1f1.alf) 1) ...