Educational Codeforces Round 132 div.2 A-F题解
Posted 欣君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 132 div.2 A-F题解相关的知识,希望对你有一定的参考价值。
视频讲解:TBD
A. Three Doors
题目大意
有 3 3 3 个门和 3 3 3 把对应的钥匙。其中 2 2 2 把钥匙分别在 2 2 2 扇门后, 1 1 1 把在手上。打开门才能获得门后的钥匙,问能否打开所有的门。
题解
判断前两次开的门后,是否有钥匙即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
int T,x,a[5],now;
scanf("%d",&T);
while(T--)
scanf("%d%d%d%d",&x,&a[1],&a[2],&a[3]);
now=3^2^1^a[1]^a[2]^a[3];
if(a[now]==0||a[a[now]]==0)
printf("NO\\n");
else
printf("YES\\n");
B. Also Try Minecraft
题目大意
有长为
n
n
n 列的世界,第
i
i
i 列高
a
i
a_i
ai 。每一步可以向左或向右移动一格,若移动到更低处,则会受到高度差的伤害。
q
q
q 次询问,每次询问求从低
s
s
s 列移动第
j
j
j 列会受到多少伤害。
题解
预处理受到伤害的前缀和与后缀和,每次询问时求差即可得到答案。
p
r
e
i
=
p
r
e
i
−
1
+
m
a
x
(
0
,
a
i
−
1
−
a
i
)
pre_i=pre_i-1+max(0,a_i-1-a_i)
prei=prei−1+max(0,ai−1−ai)
s u f i = s u f i + 1 + m a x ( 0 , a i + 1 − a i ) suf_i=suf_i+1+max(0,a_i+1-a_i) sufi=sufi+1+max(0,ai+1−ai)
a n s = p r e t − p r e s t ≥ s s u f t − s u f s t < s ans=\\begincases pre_t-pre_s &t\\geq s \\\\ suf_t-suf_s &t<s \\endcases ans=pret−pressuft−sufst≥st<s
注意开long long。
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=100100;
ll a[MAXN],pre[MAXN],suf[MAXN];
int main()
int n,m,i,s,t;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(i=2;i<=n;i++)
pre[i]=pre[i-1]+max(0ll,a[i-1]-a[i]);
for(i=n-1;i>=1;i--)
suf[i]=suf[i+1]+max(0ll,a[i+1]-a[i]);
while(m--)
scanf("%d%d",&s,&t);
if(t>s)
printf("%lld\\n",pre[t]-pre[s]);
else
printf("%lld\\n",suf[t]-suf[s]);
C. Recover an RBS
题目大意
给定带未知符’?'的括号序列,每个"?“表示为”(“或”)",求是否存在唯一方案得到合法的括号序列
题解
从左到右遍历,维护以下两个初始为 0 0 0 的变量:
- dep:括号序列的深度。遇到"(" 则 + 1 +1 +1 ,遇到")" 则 − 1 -1 −1 。
- now:未确定的"?" 数量。
遍历时,存在以下两个特殊情况:
- 若 d e p < 0 dep<0 dep<0 ,则之前必定有个未确定的"?“需要为”(",即 d e p + + , n o w − − dep++,now-- dep++,now−− 。
- 若 d e p = 0 , n o w = 1 dep=0,now=1 dep=0,now=1 ,则之前唯一的未确定的"?“必须为”(",即 d e p + + , n o w − − dep++,now-- dep++,now−− 。
最终判断 ∣ d e p ∣ = n o w |dep|=now ∣dep∣=now 是否成立即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=200200;
char s[MAXN];
int main()
int T,now,dep,i,len;
scanf("%d",&T);
while(T--)
scanf("%s",&s);
len=strlen(s);
now=0;
dep=0;
for(i=0;i<len;i++)
if(s[i]=='(')
dep++;
else if(s[i]==')')
dep--;
if(dep<0)
dep++;
now--;
else
now++;
if(dep==0&&now==1)
dep++;
now--;
if(abs(dep)==now)
printf("YES\\n");
else
printf("NO\\n");
D. Rorororobot
题目大意
给定 n ( 1 ≤ n ≤ 1 0 9 ) n(1 \\leq n \\leq 10^9) n(1≤n≤109) 行 m ( 1 ≤ m ≤ 2 ⋅ 1 0 5 ) m(1 \\leq m \\leq 2 \\cdot 10^5) m(1≤m≤2⋅105) 列的网格图,第 i i i 行的第 1 , 2 , 3 , . . . , a i 1,2,3,...,a_i 1,2,3,...,ai 格为障碍物。
有 q ( 1 ≤ q ≤ 2 ⋅ 1 0 5 ) q(1 \\leq q \\leq 2\\cdot 10^5) q(1≤q≤2⋅105) 次询问,每次询问给定起点坐标 ( x s , y s ) (x_s,y_s) (xs,ys) ,终点坐标 ( x t , y t ) (x_t,y_t) (xt,yt) 和正整数 k ( 1 ≤ k ≤ 1 0 9 ) k(1 \\leq k \\leq 10^9) k(1≤k≤109) 。
从起点开始,每步可以向任意方向移动 k k k 格,途中不能碰到障碍物或走出网格,问能否从起点走到终点。
题解
由于移动是可反悔的,且障碍物均在下方。因此可以先把起点和终点不断移动到上面,再判断能否从起点走到终点。 以上是关于Educational Codeforces Round 132 div.2 A-F题解的主要内容,如果未能解决你的问题,请参考以下文章 Educational Codeforces Round 7 A Educational Codeforces Round 7 Educational Codeforces Round 90 Educational Codeforces Round 33
x
s
+
=
⌊
n
−
x
s
k
⌋
∗
k
x_s+=\\lfloor \\fracn-x_sk \\rfloor*k
xs+=⌊k