[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 ...
随机推荐
- pytest-调整测试用例的执行顺序
场景:未考虑按自然顺序执行时,或想变更执行顺序,比如增加 数据的用例要先执行,再执行删除的用例.测试用例默认是按名 称顺序执行的. • 解决: • 安装:pip install pytest-orde ...
- Android中XML的命名空间、自定义属性
命名空间(namespace) XML 命名空间提供避免元素命名冲突的方法. 举个例子,A学校有名学生叫做林小明,B学校也有名学生叫林小明,那我们如何识别这两名拥有相同名字的同学呢?这时候命名空间就派 ...
- Python 基础 4-1 字典入门
引言 字典 是Python 内置的一种数据结构,它便于语义化表达一些结构数据,字典是开发中常用的一种数据结构 字典介绍 字典使用花括号 {} 或 dict 来创建,字典是可以嵌套使用的 字典是成对出现 ...
- Nginx反向代理与负载均衡应用实践(二)
Nginx反向代理与负载均衡应用实践(二) 链接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ 提取码:migq 复制这段内容后打开百度网盘手机App ...
- handsontable 随记
handsontable 怎么样获取合并之后的cell信息,如下 handsontable .getPlugin('mergeCells').mergedCellsCollection 看了他的源代码 ...
- 【读书笔记】C/C++程序员面试秘籍
第一章 C/C++ 程序基础(共12题) 第二章 预处理.const.static.和 sizeof(共27题) 第三章 引用和指针(共39题) 第四章 字符串(共31题) 第五章 位运算与嵌入式编程 ...
- vue 重定向
//重定向 { path: '/*', component: Home}
- kubeadm部署k8s集群
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 kubeadm ini ...
- react-router v3和v4区别
1.默认路由 v3 <IndexRoute> v4 <Route exact> 2.授权路由 import Redirect from 'react-router-dom' & ...
- 【SQL】Mysql常用sql语句记录
1.创建用户.赋予权限 CREATE DATABASE scadm DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER 's ...