【atcoder】abc302 ~ abc311题解

TOYOTA MOTOR CORPORATION Programming Contest 2023#2 (AtCoder Beginner Contest 302)

D

枚举 A A A 里选的,那么需要找到最大的满足和 A i A_i Ai 的差不超过 D D D B j B_j Bj,显然可以用二分实现。

E

3 × 1 0 5 3 \times 10^5 3×105 显然可以带 l o g log log,应该是 S T L STL STL。因为每次都要输出,所以考虑动态维护当前答案。最开始每个点都是孤立点, a n s = n ans = n ans=n。对于第一种操作,如果 u u u v v v 本来没有连边,显然连了一条边后他们就不是孤立点了, a n s ans ans 要减掉他们中原来没有连边的点的数量。对于第二种操作,显然 v v v 必定会变成孤立点,但如果 v v v 原来就是孤立点, a n s ans ans 没有变化。对于和 v v v 相连的点,那么如果他们的邻接点的数量只有 1 1 1 v v v 这个点)显然删掉这条边后这个点也会变成孤立点, a n s − − ans -- ans

所以用 s e t set set 记每个点的邻接点集,删除(第二个操作)和插入(第一个)都是 l o g log log 的。

NS Solutions Corporation Programming Contest 2023(AtCoder Beginner Contest 303)

A

逐个字符判断即可。

B

标记一下一对人是否不存在矛盾,然后枚举每一对人,计数他么之间存在矛盾的。

C

m a p map map 记录有资源的位置,按照题目模拟他的移动即可。开始因为没有再走过以后将当前位置的map变成0,W了一下。

D

d p i , 0 dp_{i, 0} dpi,0 表示打完前i个字符以后,caps灯熄灭。 d p i , 1 dp_{i, 1} dpi,1 表示打完前i个字符后,caps灯亮着。

对于 d p i , 0 dp_{i, 0} dpi,0 的转移,如果当前字符是大写,那么一种情况是上一步就有 c a p s caps caps,那么直接按 a a a 就行。或者上一步没有 c a p s caps caps,这一步打 s h i f t + a shift+a shift+a。如果是小写,一种情况是上一步没有 c a p s caps caps,直接打 a a a 就行。上一步有,那么先把它按掉,再打一个 a a a d p i , 1 dp_{i, 1} dpi,1 同理。

E

赛时没弄懂题意,没想到这么简单。一个点如果他连接了两个点以上( l e v e l 2 level2 level2 星图要特殊处理),那么他就是一个 l e v e l level level 为其连接的边数的星图。对于剩下的点,他们显然不构成更高的星图,三个点构成一个 l e v e l 2 level2 level2 的星图,所以剩下的点数除三就是 l e v e l 2 level2 level2 星图的数量。

Tokio Marine & Nichido Fire Insurance Programming Contest 2023(AtCoder Beginner Contest 304)

A

按题意模拟即可。

B

要删的位数等于长度-3, s t r i n g string string 模拟一下就行了。

C

瞎了,没看范围。思路就是从点1一层层扫,只要能感染就感染,有点像 F l o o d F i l l Flood Fill FloodFill

D

N ≤ 2 × 1 0 5 N \leq 2 \times 10^5 N2×105,从 N N N 入手,二分每一个草莓在哪个蛋糕上,,用 m a p map map 记录一下每个蛋糕的数量,但是要考虑一下 0 , H , W 0, H, W 0,H,W,不知道为啥写寄了。

E

对于约束 x i , y i xi, yi xi,yi,显然只要连通了他们所属的连通块,就会使得这条约束不成立。所以对于询问 p i , q i pi, qi pi,qi,判断有没有触犯 K K K 个约束中的一条就行了,因为范围的缘故,用 m a p map map 记一下,对于 p i , q i pi, qi pi,qi 就查一下 m a p map map 就可以了。

KYOCERA Programming Contest 2023(AtCoder Beginner Contest 305)

A

取决于其两边 5 5 5 的倍数与其的差,模拟即可。

B

枚举他们间的位置,用数组记每一段的长度即可,注意判断 a > b a>b a>b 的情况,要 s w a p swap swap 一下。

C

首先要确定方块的位置,左上角是 ( m i n x , m i n y ) (minx,miny) (minx,miny),右下角是 ( m a x x , m a x y ) (maxx,maxy) (maxx,maxy) ,在方格内枚举一下那一个是.就行了

D

首先将睡觉的部分分为:整的睡觉时间和残缺的睡觉时间。首先可以用二分确定整的睡觉时间是第l个到第r个,这部分可以直接用前缀和解决。接着,对于残缺的,对于左右边界进行计算即可。开始因为前缀和写错了调了好久。

E

看到题目很容易想到多源 b f s bfs bfs(我就是这样写的)。但是会出现问题。例如:从一个管辖范围为 x x x 的守卫延伸出了一个点 u u u,后面一个管辖范围比他更大的守卫扫到了 u u u,但是前面已经被标记过了,就不会走,但是显然他很有可能穿过 u u u 继续延伸。因此,不希望出现有管辖范围小的在管辖范围大的前面延伸。所以每次都选管辖范围最大的就行了,可以用优先队列维护。

Tokio Marine & Nichido Fire Insurance Programming Contest 2023(AtCoder Beginner Contest 307)

A

对于每周进行一次统计即可,模拟。

B

枚举i,j然后进行判断即可,注意 i , j i,j i,j 倒过来的情况,在这里W了一发。

C

赛时没读懂题意,待补。

D

对于每一组匹配的括号都可以用栈解决,就是个板子。接着对于每一对括号,显然他们之间的都不能是答案,所以标记一下,最后没有标记的就是答案中的字符。但是如果这样直接保利标记的话会t,所以可以想到差分,这样是 O ( 1 ) O(1) O(1) 的。

E

d p dp dp 题。设 d p i , 0 dp_{i, 0} dpi,0 表示 i i i 这个人的数字与 1 1 1 不同的方案数, d p i , 1 dp_{i, 1} dpi,1 反之。接下来考虑转移。

d p i , 0 dp_{i, 0} dpi,0

与i相邻的i-1要与i不同,那么显然有两种情况:

1. i − 1 i-1 i1 1 1 1 相同

2. i − 1 i-1 i1 1 1 1 不同且和i不同。

那么第一种显然i的选择还剩下 m − 1 m-1 m1 种(0~ m − 1 m-1 m1中除了 1 1 1 选的数字外的数)

第二种就是还剩下 m − 2 m-2 m2 中选择( i i i 的)。

综上所述 d p i , 0 dp_{i, 0} dpi,0 = d p i − 1 , 1 × ( m − 1 ) + d p i − 1 , 0 × ( m − 2 ) dp_{i-1, 1} \times (m-1) + dp_{i-1, 0} \times (m-2) dpi1,1×(m1)+dpi1,0×(m2)

dp_{i, 1}

i i i 相邻的 i − 1 i-1 i1 要与 i i i 不同,并且知道 i i i 1 1 1 相同,所以 i − 1 i-1 i1 为了与 i i i 不同只能与 1 1 1 不同即 d p i − 1 , 0 dp_{i-1, 0} dpi1,0

d p i , 1 = d p i − 1 , 0 dp_{i, 1} = dp_{i-1, 0} dpi,1=dpi1,0

因为 n n n 1 1 1 相邻,所以 n n n 不能等于 1 1 1,即答案为 d p n , 0 dp_{n, 0} dpn,0

ARC164

B

简单分析可得这条路径一定是一条同色,然后其余的都是不同色。所以可以先把所有不同色的边链接的点都合并,然后对于同色的边判断是否再一个集合里,如果在显然就形成一条路径。

Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)

A

扫一遍就行了,分别统计一下出现的次数即可。

B

把全空的天找出来然后模拟即可。

C

找出环中的一个点,然后不停跑后继点即可。

D

b f s bfs bfs。把能跑的全跑了就行,但是注意死循环的情况,两种:在一个点重复跑一个方向, x = > y x=>y x=>y y y y 跑了 x x x 跑的方向的反方向,用 v i s i , j , 0 / 1 / 2 / 3 vis_{i, j, 0/1/2/3} visi,j,0/1/2/3 记录一下即可,这题不需要预处理上下左右跑出来的位置。

E

赛时想到思路了,但没时间写了。对于 ( i , j ) (i,j) (i,j) ,统计以 ( i , j (i,j (i,j )为右下角的正方形的数量(即最大的正方形的长度)。此时可以观察到单调性:开始的一段没有1的,然后剩下的就是有 1 1 1 的。二分一下就行了,把所有的这样二分出来的 l − 1 l-1 l1 统计一下即可。

你可能感兴趣的:(atcoder,算法,题解)