[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 ...
随机推荐
- Neo4J空间数据存储
1.Neo4j Spatial 简介 1.1Neo4j Spatial概念 Neo4j Spatial项目是图数据库Neo4j的一个插件,它通过将空间数据映射到图模型(graph model),它将对 ...
- codeforces 724G - Xor-matic Number of the Graph 线性基+图
题目传送门 题意:给出衣服无向带权图,问有多少对合法的$<u,v,s>$,要求$u$到$v$存在一条路径(不一定是简单路径)权值异或和等于$s$,并且$u<v$.求所有合法三元组的s ...
- chroot 试用alpinelinux安装软件包的问题
前边有说明使用chroot 体验alpinelinux,但是因为默认没有dns server,造成软件包无法下载 现象 问题原因 解决方法 copy host resolv.conf 到alpine ...
- 使用cordova network-information 插件监听手机网络状态
在使用html5配合cordova做webapp时,有时需要实时监测手机的网络 状况.html5里面是没有相关的js的,这时就需要在cordova里找相关插件了. 一.插件查找 1.在cordova中 ...
- 查看git HEAD
如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看, 如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向.
- mysql8.*忘记密码
1.关闭mysql服务 2.打开cmd窗口,找到安装目录下的bin然后复制命令 mysqld --console --skip-grant-tables --shared-memory 3.再打开一个 ...
- visual_c++外挂教程(详细)
课程分四个大章节 初级篇,中级篇,进阶篇,高级篇 初级篇内容:编写一个完整的,简单的外挂 C++的数据类型:Byte,Word,DWORD,int,float API函数的调mouse_event,G ...
- html+css 常用布局
1.中间固定宽度,两侧自适应 1.1 flex布局 <!DOCTYPE html><html lang="en"> <head> <met ...
- 为什么TCP 会粘包断包UDP不会
TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务.收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发 ...
- Codeforces 1189C Candies!
题目链接:http://codeforces.com/problemset/problem/1189/C 思路:前缀和. AC代码: #include<bits/stdc++.h> usi ...