[BZOJ3110][ZJOI2013]K大数查询(整体二分)
sol
整体二分,其实很简单的啦。
对所有询问二分一个答案mid,把所有修改操作中数字大于mid的做一个区间覆盖(区间加1)
查询就是区间查询
然后左右分一分即可
注意是第k大
然后关于树状数组的区间修改区间查询,有一篇学长的博客链接,其实原理还是蛮简单的。
比线段树好写还常数小比yyb跑得快
code
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 50005;
#define ll long long
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
struct query{
int opt,a,b,c,id;
}q[N],q1[N],q2[N];
int n,m,qcnt,ans[N];ll c1[N],c2[N],tmp[N];
void modify(int pos,int val)
{
for (int k=pos;k<=n;k+=k&-k)
c1[k]+=val,c2[k]+=pos*val;
}
ll query(int pos)
{
ll res=0;
for (int k=pos;k;k-=k&-k)
res+=(ll)(pos+1)*c1[k]-c2[k];
return res;
}
void solve(int L,int R,int l,int r)
{
if (L>R) return;
if (l==r)
{
for (int i=L;i<=R;i++)
if (q[i].opt==2) ans[q[i].id]=l;
return;
}
int mid=(l+r)/2;
for (int i=L;i<=R;i++)
if (q[i].opt==2) tmp[q[i].id]=query(q[i].b)-query(q[i].a-1);
else if (q[i].c>mid) modify(q[i].a,1),modify(q[i].b+1,-1);
for (int i=L;i<=R;i++)
if (q[i].opt==1&&q[i].c>mid) modify(q[i].a,-1),modify(q[i].b+1,1);
int t1=0,t2=0;
for (int i=L;i<=R;i++)
if (q[i].opt==2)
if ((ll)q[i].c>tmp[q[i].id]) q[i].c-=tmp[q[i].id],q1[++t1]=q[i];
else q2[++t2]=q[i];
else
if (q[i].c<=mid) q1[++t1]=q[i];
else q2[++t2]=q[i];
for (int i=L,j=1;j<=t1;i++,j++) q[i]=q1[j];
for (int i=L+t1,j=1;j<=t2;i++,j++) q[i]=q2[j];
solve(L,L+t1-1,l,mid);solve(L+t1,R,mid+1,r);
}
int main()
{
n=gi();m=gi();
for (int i=1;i<=m;i++)
{
q[i].opt=gi();q[i].a=gi();q[i].b=gi();q[i].c=gi();
if (q[i].opt==2) q[i].id=++qcnt;
}
solve(1,m,0,n);
for (int i=1;i<=qcnt;i++) printf("%d\n",ans[i]);
return 0;
}
[BZOJ3110][ZJOI2013]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大的数 ...
- P3332 [ZJOI2013]K大数查询 整体二分
终于入门整体二分了,勉勉强强算是搞懂了一个题目吧. 整体二分很多时候可以比较好的离线处理区间\(K\)大值的相关问题.考虑算法流程: 操作队列\(arr\),其中有询问和修改两类操作. 每次在答案的可 ...
- BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]
有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...
- BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)
题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...
- [ZJOI2013]K大数查询——整体二分
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是: 1 a b c:表示在第a个位置到第b个位置,每个位置加上一个数c 2 a b c:表示询问从第a个位置到第b个位置,第C大的数是多少. ...
- BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分
[题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...
- BZOJ3110:[ZJOI2013]K大数查询(整体二分版)
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...
- BZOJ 3110 [ZJOI2013]K大数查询 (整体二分+线段树)
和dynamic rankings这道题的思想一样 只不过是把树状数组换成线段树区间修改,求第$K$大的而不是第$K$小的 这道题还有负数,需要离散 #include <vector> # ...
随机推荐
- php会话(session)实现原理
先考虑如下问题: 禁用了cookie,session能否使用? 如何把session存储数据库/memcached/redis 如何实现一个严格的30分钟过期的会话?. 如何实践web服务器集群的会话 ...
- 如何让div水平居中呢?
一百度div居中,多数都是一个答案,但是有时候这种方法并不是万能的...不废话,将我知道的方法都列举一下好了,随时更新. 1.设置width值,指定margin-left和margin-right为a ...
- 搭建ssr服务器
搭建ssr服务器 首先,先说一下,为什么这么久没写博客. 一方面,最近在搭建自己的服务器.挺忙的. 另一方面,写了许多有关服务器构建,网站构建的word.但没有润色,所以打算等自己服务器做好了整理一下 ...
- 解决 java.lang.ClassNotFoundException: org.springframework.beans.factory.config.EmbeddedValueResolver
1.今天用maven配置了一下dubbo的项目发现启动项目后意外报错: java.lang.ClassNotFoundException: org.springframework.beans.fact ...
- [翻译] .NET Core 2.1 Preview 1 发布
[翻译] .NET Core 2.1 Preview 1 发布 原文: Announcing .NET Core 2.1 Preview 1 今天,我们宣布发布 .NET Core 2.1 Previ ...
- typeahead + JDK 8 并行流 + redis 高速即时查询.
感谢JDK8,让我们JAVA 程序员暂时不用担心失业. 有些情况,需要根据用户输入值,即时查询数据库,MYSQL显然不再适合这种业务. mongoDB看似最适合,但是为了这么一个破功能,也不值得特意去 ...
- 决策树--ID3 算法(一)
Contents 1. 决策树的基本认识 2. ID3算法介绍 3. 信息熵与信息增益 4. ID3算法的C++实现 1. 决策树的基本认识 决策树是一种 ...
- hbase存储优化
1.上面的2张图主要说明hbase的存储特点 (1).每个值(每条记录的每一个列的值)的存储,都完整的存储了rowkey.column family.column.版本(时间戳),以及该列的值. 这样 ...
- OSQA的配置
1.安装Python,我安装的是python 2.7.3 2.安装setuptools 下载setuptools,并安装 安装好以后,在pyton2.7/scripts的路径下将会有easy_inst ...
- Redis笔记5-redis高可用方案
一.哨兵机制 有了主从复制的实现以后,如果想对主服务器进行监控,那么在redis2.6以后提供了一个"哨兵"的机制.顾名思义,哨兵的含义就是监控redis系统的运行状态.可以启动多 ...