[LOJ#2732] 「JOISC 2016 Day 2」雇佣计划
(不过个人感觉我讲的稍微更清楚一点)
题目就是让我们求图中满足数值大于等于B的连通块数量
然后我们可以尝试转换为求连通块两端所产生的“谷”的数量,显然一个连通块对谷可以贡献2的答案,最终答案就是谷的数量除以2
(下图为查询$B_i$大小为4时的情况,每一个箭头代表一个谷)

发现每两个数中间的空格都是有可能产生谷的,所以我们只需要维护有多少个空格满足产生谷的条件即可
记一个空格左边的数字为X,右边的数字为Y,当前询问为B,观察发现,当且仅当满足下列条件时,这个空格可以成为谷
$$min(X,Y)+1 \leq B \leq max(X,Y)$$
我们需要一种可以在$logn$的复杂度内维护满足上述条件点的数量,支持单点修改区间查询的数据结构,发现树状数组可以很好的满足这个要求、
我们把这个询问条件差分一下扔到树状数组里维护即可
一些注意点:
开始更新的时候要把0和n+1这两个节点也算进去,以免漏记录两端的“谷”
观察到$a_i$,$b_i$很大,我们需要进行必要的离散化
代码:
//hgs AK IOI,IMO,ICHO,IPHO
#include<bits/stdc++.h>
#define writeln(x) write(x),puts("")
#define writep(x) write(x),putchar(' ')
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}void write(int x){
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}const int M= 6e5+;
int s[M],n,m,x,y,z,b[M],len,v[M];
struct P{int opt,x,y;}q[M];
#define low(x) (x&-x)
inline int GetNum(int x){return lower_bound(b+,b+len+,x)-b;}
inline void Update(int x,int y){for(++x;x<=n*;x+=low(x))s[x]+=y;}
inline int Query(int x){int ans=;for(++x;x;x-=low(x))ans+=s[x];return ans;}
inline void Init(){int tot=;//离散化 + 树状数组初始化
for(int i=;i<=n;i++)b[++tot]=v[i];
for(int i=;i<=m;i++)if(q[i].opt==)b[++tot]=q[i].x;else b[++tot]=q[i].y;
sort(b+,b+tot+),len=unique(b+,b+tot+)-b-;
for(int i=;i<=n;i++)v[i]=GetNum(v[i]);
for(int i=;i<=m;i++)if(q[i].opt==)q[i].x=GetNum(q[i].x);else q[i].y=GetNum(q[i].y);
for(int i=;i<=n+;i++){
int l=v[i-],r=v[i];
if(l>r)swap(l,r);
Update(++l,),Update(++r,-);
}
}
inline void Add(int x,int y){
int l=v[x-],r=v[x];
if(l>r)swap(l,r);
Update(++l,y),Update(r+,-y);
l=v[x],r=v[x+];
if(l>r)swap(l,r);
Update(++l,y),Update(r+,-y);
}
inline void Solve(){
for(int i=;i<=m;i++)
if(q[i].opt==)printf("%d\n",Query(q[i].x)/);
else Add(q[i].x,-),v[q[i].x]=q[i].y,Add(q[i].x,);
}
int main(){
n=read(),m=read();
for(int i=;i<=n;i++)v[i]=read();
for(int x,y,z,i=;i<=m;i++){
if((x=read())==)q[i].opt=,q[i].x=read();
else q[i].opt=,q[i].x=read(),q[i].y=read();
}Init();Solve();
return ;
}
[LOJ#2732] 「JOISC 2016 Day 2」雇佣计划的更多相关文章
- Loj #2731 「JOISC 2016 Day 1」棋盘游戏
Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...
- LOJ 2737 「JOISC 2016 Day 3」电报 ——思路+基环树DP
题目:https://loj.ac/problem/2737 相连的关系形成若干环 / 内向基环树 .如果不是只有一个环的话,就得断开一些边使得图变成若干链.边的边权是以它为出边的点的点权. 基环树的 ...
- LOJ 2736 「JOISC 2016 Day 3」回转寿司 ——堆+分块思路
题目:https://loj.ac/problem/2736 如果每个询问都是 l = 1 , r = n ,那么每次输出序列的 n 个数与本次操作的数的最大值即可.可以用堆维护. 不同区间的询问,可 ...
- LOJ #2731. 「JOISC 2016 Day 1」棋盘游戏(dp)
题意 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少有一个棋子,也至少有一个空位. 游戏的目标是:在还没有放棋 ...
- 「JOISC 2016 Day 1」棋盘游戏
「JOISC 2016 Day 1」棋盘游戏 先判无解:第1,3行有连续的空格或四个角有空格. 然后可以发现有解的情况第1,3行可以在任意时间摆放. 对于某一列,若第2行放有棋子,那么显然可以把棋盘分 ...
- loj 2392「JOISC 2017 Day 1」烟花棒
loj 答案显然满足二分性,先二分一个速度\(v\) 然后显然所有没有点火的都会往中间点火的人方向走,并且如果两个人相遇不会马上点火,要等到火快熄灭的时候才点火,所以这两个人之后应该在一起行动.另外有 ...
- 「JOISC 2016 Day 3」回转寿司
https://loj.ac/problem/2736 题解 挺有意思的题. 考虑这种操作不好直接维护,还有时限比较长,所以考虑分块. 考虑一个操作对整个块的影响,无非就是可能把最大的拿走,再把新的元 ...
- loj2734「JOISC 2016 Day 2」女装大佬 || 洛谷P3615 如厕计划
loj2734 洛谷P3615 http://218.5.5.242:9021/problem/185 不会做... 题解(来自ditoly): 这一步更详细的解释(来自kkksc03): 还是从后面 ...
- [LOJ #2833]「JOISC 2018 Day 1」帐篷
题目大意:有一个$n\times m$的网格图,若一个人的同一行或同一列有人,他就必须面向那个人,若都无人,就可以任意一个方向.若一个人无法确定方向,则方案不合法,问不同的方案数.$n,m\leqsl ...
随机推荐
- 初探Remoting双向通信(四)
原 初探Remoting双向通信(四) 2013年06月26日 11:11:32 喜欢特别冷的冬天下着雪 阅读数 2632 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- Oracle多种表连接方式
1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不加限制) 3. 自连接(同一张表内的连接) SQL的标准语 ...
- cordova-plugin-alipay-v2使用篇(更新至20170725)(亲测可用)
cordova-plugin-alipay-v2使用篇(更新至20170725)(亲测可用) alipaySdk已更新至20170725版本 支付宝WS_APP_PAY_SDK_BASE_2.0 &l ...
- VirtualBox安装CentOS系统
1. 准备材料 虚拟机软件: VirtualBox 系统iso版本:CentOS-7-x86_64-DVD-1611.iso 虚拟机软件下载地址: https://www.virtualbox.org ...
- python 正则匹配
正则表达式模式 模式字符串使用特殊的语法来表示一个正则表达式: 字母和数字表示他们自身.一个正则表达式模式中的字母和数字匹配同样的字符串. 多数字母和数字前加一个反斜杠时会拥有不同的含义. 标点符号只 ...
- 牛客多校第六场-H-Pair
链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the numb ...
- 【LeetCode】二分
[475] Heaters [Easy] 给你一排房子,一排加热器.找到能warm所有房子的最小加热器半径. 思路就是对于每个房子,找离它最近的左右两台heater, 分别求距离.温暖这个房子的hea ...
- mysql 判断指定条件数据存不存在,不存在则插入
折腾了半天终于把这个给折腾顺了,但是后来发现用不了竟然...悲剧啊,但是还是要记录下加深记忆 insert into table1 (field1, field2,field3) select ?fi ...
- 多核cpu实现多任务原理
- js 实现弹出层效果
代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <tit ...