传送门

题意:

  给出你序列 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. golang之常量

    1.  常量可以是全局常量,也可以是函数内部的局部常量.常量的值不可修改,常量表达式的值在编译期计算,而不是在运行期.存储在常量中的数据类型只可以是布尔型.数字型(整数型.浮点型和复数)和字符串型.当 ...

  2. PHP生成唯一的促销/优惠/折扣码,由字母和数字组成。

    首先我们先搞清楚什么是促销/优惠/折扣码?它有什么用作: 每一个电子商务网站,现在有一种或多种类型的优惠/折扣/优惠券系统,给大家分享一下如何在PHP生成唯一的促销/折扣码.主要是实现一个优惠码系统, ...

  3. JS原生实现五角星评价详情demo

    <style> *{margin: 0;padding: 0;} .pingfen{ width: 195px; margin:10px auto; height:20px; positi ...

  4. Spark day05

    Shark Shark是基于Spark计算框架之上且兼容Hive语法的SQL执行引擎,由于底层的计算采用了Spark,性能比MapReduce的Hive普遍快2倍以上,当数据全部load在内存的话,将 ...

  5. 安装tomcat(fedora16)

    sudo yum install tomcat6 sudo yum install tomcat6-webapps sudo yum install tomcat6-admin-webapps   s ...

  6. python Python程序的架构

  7. vue插件大全

    一.UI组件及框架 element - 饿了么出品的Vue2的web UI工具套件 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开源 UI 组件库 Keen-UI ...

  8. 巨蟒python全栈开发-第11阶段 ansible3_3入门playbook剧本

    1.playbook剧本 2.playbook传参 3.setup模块介绍 4.playbook的tags 5.playbook的handlers&&templates模块 6.条件和 ...

  9. Java“类”的内存分配_case1

  10. Docker 学习笔记 2019-05-27

    Docker 学习笔记 2019-05-27 可以很方便的打包应用. 使用 docker-compose 更方便. 每个发行版安装方式不一样,如果 centos 直接安装很可能会安装成旧版本. Lin ...