传送门

题意:

  给出你序列 a,在序列 a 上执行两种操作;

  ① 0 :查询有多少连续的片段[L,...,R],满足 a[L,...,R] > l;

  ② 1 p d :将第 p 个数增加 d;

思路:

 int n,m,l;
ll a[maxn];
int fa[maxn];///a[L,...,x] > l 的最小的L;
/**
_bit[0][x]:a[x] > l,_bit[0][x]=1,反之为0;
_bit[1][x]:a[L,...,R] > l,_bit[L]=1,_bit[L+1,...,R]=0,
即满足条件的连续片段[L,...R],只将开始位置L赋为1
*/
bitset<maxn>_bit[];

  在 m 次操作中,只有出现 a[p] ≤ l && a[p]+d > l 时,才有可能合并区间;

  即a[L,...,p-1] > l , a[p+1,...,R] > l ,现在 a[p]+d > l 使得 [L,...,p-1] 与 [p+1,...,R] 可以合并成 a[L,...R] > l;

AC代码:

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+; int n,m,l;
ll a[maxn];
int fa[maxn];///a[L,...,x] > l 的最小的L;
/**
_bit[0][x]:a[x] > l,_bit[0][x]=1,反之为0;
_bit[1][x]:a[L,...,R] > l,_bit[L]=1,_bit[L+1,...,R]=0,
即满足条件的连续片段[L,...R],只将开始位置L赋为1
*/
bitset<maxn>_bit[]; int Find(int x)
{
return x == fa[x] ? x:fa[x]=Find(fa[x]);
}
void Solve()
{
for(int i=;i <= n;++i)
{
if(a[i] <= l)
continue; _bit[].set(i); int x=i;
if(_bit[][i-])
x=Find(i-);
fa[i]=x;
_bit[].set(x);
}
for(int i=;i <= m;++i)
{
int que;
scanf("%d",&que);
if(!que)
printf("%d\n",_bit[].count());
else
{
int p,d;
scanf("%d%d",&p,&d);
if(_bit[][p])
continue; a[p] += d;
if(a[p] <= l)
continue; _bit[].set(p); int x=p;
if(_bit[][p-])
x=Find(p-);///查找a[L,...,p]>l的最小的L;
fa[p]=x;
///[L,...,R]
///查找最大的R
for(int j=p+;_bit[][j];++j)///每个数顶多遍历两边
{
fa[j]=x;///合并[L,...,R]到x上
_bit[][j]=;
}
_bit[].set(x);
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&l);
for(int i=;i <= n;++i)
{
fa[i]=i;
scanf("%lld",a+i);
}
Solve(); return ;
}

ac后看了一下standings,看到了 tourist ,然后,偷偷%了一眼大神的代码;

啊,简洁+高效,tql;

AC代码:

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+; int n,m,l;
ll a[maxn]; void Solve()
{
int ans=;
for(int i=;i <= n;++i)
if(a[i] > l && a[i-] <= l)///[L,..,R]只在L处使得ans+1
ans++; for(int i=;i <= m;++i)
{
int que;
scanf("%d",&que);
if(!que)
printf("%d\n",ans);
else
{
int p,d;
scanf("%d%d",&p,&d);
if(a[p] > l)
continue;
a[p] += d; ///[L,..,R]只在L处使得ans+1
if(a[p] > l && a[p-] <= l)
ans++; ///如果p使得[L,...,p-1]与[p+1,...,R]合并
///[L,...,p-1]使得ans+1,[p+1,...,R]使得ans+1
///所以ans需-1
if(a[p] > l && a[p+] > l)
ans--;
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&l);
for(int i=;i <= n;++i)
scanf("%lld",a+i);
Solve(); return ;
}

Mail.Ru Cup 2018 Round 2 B. Alice and Hairdresser (bitset<> or 其他)的更多相关文章

  1. Mail.Ru Cup 2018 Round 2 Solution

    A. Metro Solved. 题意: 有两条铁轨,都是单向的,一条是从左往右,一条是从右往左,Bob要从第一条轨道的第一个位置出发,Alice的位置处于第s个位置,有火车会行驶在铁轨上,一共有n个 ...

  2. 【Mail.Ru Cup 2018 Round 2 B】 Alice and Hairdresser

    [链接] 我是链接,点我呀:) [题意] [题解] 因为只会增加. 所以. 一开始暴力算出来初始答案 每次改变一个点的话. 就只需要看看和他相邻的数字的值就好. 看看他们是不是大于l 分情况增加.减少 ...

  3. Mail.Ru Cup 2018 Round 3 B. Divide Candies

    题目链接 分析一下题意可以得到题目要求的是满足下面这个 公式的不同的i,ji,ji,j的方案数; 即(i2+j2)mod&ThinSpace;&ThinSpace; m=0 (n ≤  ...

  4. Mail.Ru Cup 2018 Round 3

    A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  5. Mail.Ru Cup 2018 Round 2

    A:阅读理解. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...

  6. [codeforces Mail.Ru Cup 2018 Round 3][B Divide Candies ][思维+数学]

    https://codeforces.com/contest/1056/problem/B 题意:输入n,m    求((a*a)+(b*b))%m==0的(a,b)种数(1<=a,b<= ...

  7. [codeforces Mail.Ru Cup 2018 Round 1 D][ xor 操作]

    http://codeforces.com/contest/1054/problem/D 题目大意:一个序列a1 a2...an,可以对若干个元素进行取反,使所得的新序列异或和为0的区间个数最多. 题 ...

  8. Mail.Ru Cup 2018 Round 3 Solution

    A. Determine Line Water. #include <bits/stdc++.h> using namespace std; ]; int main() { while ( ...

  9. Mail.Ru Cup 2018 Round 1

    A. Elevator or Stairs? 签. #include <bits/stdc++.h> using namespace std; ]; int main() { while ...

随机推荐

  1. 【水滴石穿】ReactNativeDemo

    这个博主他的功底算是特别棒的了,能够把一些基础的例子,通过精巧的方式布局在一个小的demo里面 很值得我学习 放上博主的链接:https://github.com/jianiuqi/ReactNati ...

  2. 【JZOJ4921】【NOIP2017提高组模拟12.10】幻魔皇

    题目描述 幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对. 所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子.神奇的节点对则是指白 ...

  3. ubuntu16.04如何查看内存和CPU的使用情况

    ubuntu16.04如何查看内存和CPU的使用情况? 使用一下命令: gnome-system-monitor

  4. phpmyadmin误删表后的恢复过程

    转自:http://blog.csdn.net/ssrc0604hx/article/details/18717983 话说今天不知道是抽风了还是失魂了,在用phpmyadmin删除测试数据时,竟然将 ...

  5. 2017校赛 问题 D: 我知道了,你知道了吗?【递归】

    题目描述 Alice和Bob走在去学校的路上,听到两个路人的对话: 路人甲:我知道了, 你知道了吗? 路人乙:我知道你知道了,你知道了吗? 路人甲:我知道你知道我知道了,你知道了吗? 路人乙:我知道你 ...

  6. KiCad EDA 5.1.3 正式发布了

    KiCad EDA 是一款用于印刷电路板设计的开源自由软件,最初由法国人 Jean-Pierre Charras 于 1992 年推出1,现由 KiCad 开发团队维护. KiCad 目前支持英语.法 ...

  7. thinkphp5.0验证码使用

    如果没有安装验证码类,可在composer.json 文件的require里面添加 "topthink/think-captcha":"1.*",然后compo ...

  8. phpexcel使用说明5----ThinkPHP+PHPExcel[导入][导出]实现方法

    转自:http://www.thinkphp.cn/code/403.html实现步骤: 注意:phpexcel必须是1.78版本的,不能用1.8以上的 一:去官网http://phpexcel.co ...

  9. git操作——git pull 撤销误操作,恢复本地代码

    需求 开发的代码还未commit到git本地仓库,就从git远程仓库上pull了代码,导致开发的代码直接被冲掉,需要退回到上一个版本代码. 操作 进入到项目git本地仓库文件夹下 打开cmd窗口,执行 ...

  10. python 获取当前ip

    import socket # 获取本机计算机名称 hostname = socket.gethostname() # 获取本机ip ip = socket.gethostbyname(hostnam ...