Mail.Ru Cup 2018 Round 2 B. Alice and Hairdresser (bitset<> or 其他)
题意:
给出你序列 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 其他)的更多相关文章
- Mail.Ru Cup 2018 Round 2 Solution
		
A. Metro Solved. 题意: 有两条铁轨,都是单向的,一条是从左往右,一条是从右往左,Bob要从第一条轨道的第一个位置出发,Alice的位置处于第s个位置,有火车会行驶在铁轨上,一共有n个 ...
 - 【Mail.Ru Cup 2018 Round 2 B】 Alice and Hairdresser
		
[链接] 我是链接,点我呀:) [题意] [题解] 因为只会增加. 所以. 一开始暴力算出来初始答案 每次改变一个点的话. 就只需要看看和他相邻的数字的值就好. 看看他们是不是大于l 分情况增加.减少 ...
 - Mail.Ru Cup 2018 Round 3 B. Divide Candies
		
题目链接 分析一下题意可以得到题目要求的是满足下面这个 公式的不同的i,ji,ji,j的方案数; 即(i2+j2)mod   m=0 (n ≤ ...
 - Mail.Ru Cup 2018 Round 3
		
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
 - Mail.Ru Cup 2018 Round 2
		
A:阅读理解. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
 - [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<= ...
 - [codeforces Mail.Ru Cup 2018 Round 1 D][ xor 操作]
		
http://codeforces.com/contest/1054/problem/D 题目大意:一个序列a1 a2...an,可以对若干个元素进行取反,使所得的新序列异或和为0的区间个数最多. 题 ...
 - Mail.Ru Cup 2018 Round 3 Solution
		
A. Determine Line Water. #include <bits/stdc++.h> using namespace std; ]; int main() { while ( ...
 - Mail.Ru Cup 2018 Round 1
		
A. Elevator or Stairs? 签. #include <bits/stdc++.h> using namespace std; ]; int main() { while ...
 
随机推荐
- log4j:ERROR Could not read configuration file [log4j.properties]
			
遇到这个错误,程序能够正常运行,log4j.properties也在classpath中,后来在网上查了资料,把下面这个语句去掉就好啦. PropertyConfigurator.configure( ...
 - Pod在多可用区worker节点上的高可用部署
			
一. 需求分析 当前kubernetes集群中的worker节点可以支持添加多可用区中的ECS,这种部署方式的目的是可以让一个应用的多个pod(至少两个)能够分布在不同的可用区,起码不能分布在同一个可 ...
 - python 自定义检测缺失值的方法
 - C++中delete this
			
Is it legal (and moral) for a member function to say delete this? As long as you’re careful, it’s ok ...
 - 2018年DDoS攻击全态势:战胜第一波攻击成“抗D” 关键
			
2018年,阿里云安全团队监测到云上DDoS攻击发生近百万次,日均攻击2000余次.目前阿里云承载着中国40%网站,为全球上百万客户提供基础安全防御.可以说,阿里云上的攻防态势是整个中国攻防态势的缩影 ...
 - WinMail邮件服务器(客户端)环境搭建与配置
			
WinMail邮件服务器(客户端)环境搭建与配置 一.在搭建WinMail邮件服务器(客户端)之前必备 (1).在虚拟机上安装两个干净无毒的操作系统 ...
 - thinkphp5.0 使用action()报Cannot redeclare app\home\controller\CheckSubstrs()错误
			
原因:Common公共类方法isMobile()内部定义了函数CheckSubstrs(),在使用action()时,会调用两次isMobile(),导致函数CheckSubstrs()重复定义 解决 ...
 - thinkphp5.0验证码使用
			
如果没有安装验证码类,可在composer.json 文件的require里面添加 "topthink/think-captcha":"1.*",然后compo ...
 - ACK容器服务发布virtual node addon,快速部署虚拟节点提升集群弹性能力
			
在上一篇博文中(https://yq.aliyun.com/articles/647119),我们展示了如何手动执行yaml文件给Kubernetes集群添加虚拟节点,然而,手动执行的方式用户体验并不 ...
 - 搜索docker镜像
			
docker最简单的方式莫过于从现有的容器镜像开始. Docker官方网站专门有一个页面来存储所有可用的镜像,网址是:index.docker.io. 可以通过浏览这个网页来查找你想要使用的镜像,或者 ...