【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述
有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c。如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。
输入
第一行N,M
接下来M行,每行形如1 a b c或2 a b c
输出
输出每个询问的结果
样例输入
2 5
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3
样例输出
1
2
1
题解
整体二分+树状数组区间修改
前两天由于要讲整体二分,所以自己YY出了这种带修改的整体二分写法:
由于每次插入的权值时固定的,因此可以把修改和询问放到一起整体二分。
设 $solve(b,e,l,r)$ 表示解决 $[b,e]$ 中的修改和询问,其中:修改的权值、询问的答案都在 $[l,r]$ 内。
那么如果 $l=r$ ,则区间内所有询问的答案都等于 $l$ 。
否则设 $mid=\frac{l+r}2$ ,然后按照时间序扫一遍修改和询问。
对于修改:如果权值在 $[l,mid]$ 则丢到左区间,否则给这段区间整体+1并丢到右区间。
对于询问:如果区间和(实际含义为该次询问时区间内权值在 $[mid+1,r]$ 内的数的个数)大于等于询问的 $c$ ,说明 $[mid+1,r]$ 内有足够多的数,答案在 $[mid+1,r]$ 内,丢到右区间;否则把 $c$ 减去这个区间和,并丢到左区间。
清空数据结构,递归左右区间。注意对于左右区间也需要维护时间序。
需要实现:区间修改、区间求和,可以使用树状数组区间修改实现。具体可以参考 【bzoj3132】上帝造题的七分钟 。
时间复杂度 $O(n\log^2n)$ ,比树套树快了10倍多。。。(当然也有可能是我当年写的不好吧)
注意本题爆int,因此需要unsigned int(比long long略快)。
#include <cstdio>
#define N 50010
typedef unsigned int uint;
struct data
{
int opt , a , b , c , id;
}q[N] , t[N];
int flag[N] , ans[N] , n;
struct bit
{
uint v[N];
inline void add(int x , int a)
{
int i;
for(i = x ; i <= n ; i += i & -i) v[i] += a;
}
inline uint query(int x)
{
int i;
uint ans = 0;
for(i = x ; i ; i -= i & -i) ans += v[i];
return ans;
}
}A , B;
inline void modify(int x , int a)
{
A.add(x , a) , B.add(x , a * x);
}
inline uint ask(int x)
{
return (x + 1) * A.query(x) - B.query(x);
}
void solve(int b , int e , int l , int r)
{
if(l == r)
{
int i;
for(i = b ; i <= e ; i ++ )
if(q[i].opt == 2)
ans[q[i].id] = l;
return;
}
int mid = (l + r) >> 1 , i , lp = b - 1 , rp = e + 1;
uint v;
for(i = b ; i <= e ; i ++ )
{
if(q[i].opt == 1)
{
if(q[i].c > mid) modify(q[i].a , 1) , modify(q[i].b + 1 , -1) , t[--rp] = q[i];
else t[++lp] = q[i];
}
else
{
v = ask(q[i].b) - ask(q[i].a - 1);
if((uint)q[i].c <= v) t[--rp] = q[i];
else q[i].c -= v , t[++lp] = q[i];
}
}
for(i = b ; i <= e ; i ++ )
if(q[i].opt == 1 && q[i].c > mid)
modify(q[i].a , -1) , modify(q[i].b + 1 , 1);
for(i = b ; i <= lp ; i ++ ) q[i] = t[i];
for(i = rp ; i <= e ; i ++ ) q[i] = t[e + rp - i];
solve(b , lp , l , mid) , solve(rp , e , mid + 1 , r);
}
int main()
{
int m , i;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= m ; i ++ )
{
scanf("%d%d%d%d" , &q[i].opt , &q[i].a , &q[i].b , &q[i].c) , q[i].id = i;
if(q[i].opt == 2) flag[i] = 1;
}
solve(1 , m , -n , n);
for(i = 1 ; i <= m ; i ++ )
if(flag[i])
printf("%d\n" , ans[i]);
return 0;
}
【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改的更多相关文章
- BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)
题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ3110:[ZJOI2013]K大数查询(整体二分)
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分
[题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...
- 【BZOJ-3110】K大数查询 整体二分 + 线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6265 Solved: 2060[Submit][Sta ...
- 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> # ...
- BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]
有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...
- P3332 [ZJOI2013]K大数查询 整体二分
终于入门整体二分了,勉勉强强算是搞懂了一个题目吧. 整体二分很多时候可以比较好的离线处理区间\(K\)大值的相关问题.考虑算法流程: 操作队列\(arr\),其中有询问和修改两类操作. 每次在答案的可 ...
随机推荐
- 《Java程序设计》课堂实践内容总结
<Java程序设计>课堂实践内容总结 实践一 要求 修改教材P98 Score2.java, 让执行结果数组填充是自己的学号: 提交在IDEA或命令行中运行结查截图,加上学号水印,没学号的 ...
- 考研编程练习----Kruskal
#include <stdio.h> #include <stdlib.h> #define MAX 100 /* 定义边(x,y),权为w */ typedef st ...
- [POJ2104]Kth Number-[整体二分]
Description 传送门 Solution 将所有询问放在一起,二分答案的同时把区间[l,r]内的数按大小分类. Code #include<iostream> #include&l ...
- SaltStack入门篇(三)之数据系统Grains、Pillar
1.什么是Grains? Grains是saltstack的组件,用于收集salt-minion在启动时候的信息,又称为静态信息.可以理解为Grains记录着每台Minion的一些常用属性,比如CPU ...
- Java 注解 初探 (一)
自JDK1.5之后,就开始出现注解.想要了解注解的来源和注解的用法,通过搜索引擎大都是针对某一个注解的解释,很难找到关于注解系列的文章,便自己看下. 基于Annotation的注释,说明Annotai ...
- 世界杯足彩怎么买划算?机器学习AI告诉你答案(含预测)
本文首发于InfoQ公众号头条. 四年一度的世界杯又来了,作为没什么时间看球的码农,跟大家一样,靠买买足彩给自己点看球动力和乐趣, 然而总是买错球队,面对各种赔率也不知道怎么买才划算,足彩是不是碰大运 ...
- 第六章P2P技术及应用
第六章P2P技术及应用 P2P技术在我们日常生活中非常实用,例如我们常用的QQ.PPLive.BitTorrent就是基于P2P技术研发.下面将本章中的重点内容进行归纳. 文章中的Why表示产生的背景 ...
- 《图解 HTTP 》阅读 —— 第二章
第2章 简单的http协议 http 协议用于客户端和服务器端的通信. 请求访问文本或图像等资源的一端称为客户端,提供资源响应的一端称为服务器端. 请求报文: 响应报文: 为了能够处理大量的事务,ht ...
- kubeadm构建k8s之Prometheus-operated监控(0.18.1)
介绍: 大家好,k8s的搭建有许多方式,也有许多快速部署的,为了简化部署的复杂度,官方也提供了开源的kubeadm快速部署,最新1.10.x版本已经可以实现部署集群, 如果你对k8s的原理已经非常了解 ...
- 阿里与ShopRunner达成协议 联手在国内推出服务
阿里巴巴集团与美国在线零售商 ShopRunner 达成协议,将帮助后者在中国大陆销售商品和履行订单交付产品. ShopRunner 首席战略官菲奥娜·迪亚斯(Fiona Dias)周三接受媒体采访时 ...