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 ...
随机推荐
- python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)
网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受 与类和实例无绑定关系的function都属于函数(function): 与类和实例有绑定关系的function都属于方法(meth ...
- 如何使用Data Lake Analytics创建分区表
前言 Data Lake Analytics(后文简称DLA)提供了无服务化的大数据分析服务,帮助用户通过标准的SQL语句直接对存储在OSS.TableStore上的数据进行查询分析. 在关系型数据库 ...
- 如何在Data Lake Analytics中使用临时表
前言 Data Lake Analytics (后文简称DLA)是阿里云重磅推出的一款用于大数据分析的产品,可以对存储在OSS,OTS上的数据进行查询分析.相较于传统的数据分析产品,用户无需将数据重新 ...
- MySQL用户管理+MySQL权限管理
我们现在默认使用的都是root用户,超级管理员,拥有全部的权限! 但是,一个公司里面的数据库服务器上面可能同时运行着很多个项目的数据库! 所以,我们应该可以根据不同的项目建立不同的用户,分配不同的权限 ...
- hdu2577 dp
也可以字符串搞.dp思路还是很清晰的.dp[][0]表示未锁定,dp[][1]表示锁定键. #include<stdio.h> #include<string.h> #defi ...
- IDEA切换git分支
查看当前所在分支 场景:在多人开发中,需要在主分支的基础上创建一些分支分配给小团队或个人去开发,然后小分支上的小功能开发完毕之后,再merge(合并)到主分支. 1.查看当前所在的分支 下图1.1中是 ...
- Person Re-identification 系列论文笔记(四):Re-ID done right: towards good practices for person re-identification
Re-ID done right: towards good practices for person re-identification Almazan J, Gajic B, Murray N, ...
- CNN对位移、尺度和旋转不变性的讨论
CNN得益于全局共享权值和pool操作,具有平移不变性. 对于尺度不变性,是没有或者说具有一定的不变性(尺度变化不大),实验中小目标的检测是难点,需要采用FPN或者其他的方式单独处理. 对于旋转不变性 ...
- inflate用一个XML源填充view. LayoutInflater
java.lang.Object android.view.LayoutInflater This class is used to instantiate layout XML file i ...
- mysql字段中提取汉字,去除数字以及字母
如果只是删除尾部的中文,保留数据,可以用以下的简单方式 MySQL as num; +------+ | num | +------+ | +------+ DELIMITER $$ DROP FUN ...