[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 ...
随机推荐
- css点击按钮,依次动态展开面板动画效果
<a href="#one">按钮1</a> <a href="#two">按钮2</a> <a href ...
- 浅析php-fpm和fastcgi的关系
先讲讲CGI吧 浏览器向web server发起请求的时候,要有url,header,params等等吧,为什么有这些数据呢,这就是CGI的事了,CGI就规定了,传哪些数据,用什么样的格式传输 web ...
- suffixes - 列出文件后缀。
DESCRIPTION [描述] 文件后缀与文件名之间以点(.)间隔,通常包括一个或多个字母. 我们用文件后缀来描述文件的内容.很多标准的实用程序,如编译器,以后缀来识别文件类型. make(1) 就 ...
- 【Luogu】【关卡2-11】简单数学问题(2017年10月)【还差三道题】
火星人 麦森数 P1403 [AHOI2005]约数研究 f(n)表示n的约数个数,现在给出n,要求求出f(1)到f(n)的总和. 解答:有几个1做约数的个数 = n /1; 有几个2做约数的个数 = ...
- java多线程并发面试题
1.多线程有什么用? (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本.台式机乃至商用的应用服务器至少也都是双核的,4核.8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪 ...
- 爱的传送带: print(.format())
场景:用Python设计一个程序,可以打印一下祝福语: 致某某某: 今年是XXXX年的元旦, 我的祝福送四方, 东方送你摇钱树, 西方送你永安康, 南方送你成功路, 北方送你钱满 ...
- CSIC_716_20191217【事务、视图、触发器、存储过程、索引】
事务: 事务保证对数据操作时的安全性,事务中的代码要么一起成功,要么一起失败. 事务以 start transaction 开始,中间可以写诸多个sql 语句对数据库进行操作, 以rollback ...
- java程序中的多线程(转)
为什么会排队等待? 下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 ― 打印机.磁盘.数据库和显示屏 -- 由于硬 ...
- vue中使用axios进行http通信
1.安装 npm install axios 2.在main.js中全局注册 // axios不可以通过use引入,可以通过修改vue原型链 import axios from 'axios' Vue ...
- BZOJ 2655: calc(拉格朗日插值)
传送门 解题思路 首先比较容易能想到\(dp\),设\(f[i][j]\)表示前\(j\)个数,每个数\(<=i\)的答案,那么有转移方程:\(f[i][j]=f[i-1][j-1]*i*j+f ...