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=prei1+max(0,ai1ai)

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+1ai)

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=pretpressuftsufstst<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(1n109) m ( 1 ≤ m ≤ 2 ⋅ 1 0 5 ) m(1 \\leq m \\leq 2 \\cdot 10^5) m(1m2105) 列的网格图,第 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(1q2105) 次询问,每次询问给定起点坐标 ( 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(1k109)

从起点开始,每步可以向任意方向移动 k k k 格,途中不能碰到障碍物或走出网格,问能否从起点走到终点。

题解

由于移动是可反悔的,且障碍物均在下方。因此可以先把起点和终点不断移动到上面,再判断能否从起点走到终点。
x s + = ⌊ n − x s k ⌋ ∗ k x_s+=\\lfloor \\fracn-x_sk \\rfloor*k xs+=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

Codeforces Educational Codeforces Round 54 题解

Educational Codeforces Round 27