当前位置:   article > 正文

【atcoder】abc312~abc321题解_atcoder abc语法好题

atcoder abc语法好题

UNIQUE VISION Programming Contest 2023 Summer(AtCoder Beginner Contest 312)

A

把信息存进去然后找就行。

B

枚举右上角,然后模拟判断即可。

C

二分这个 X X X ,然后判断即可。

D

典型的括号类的 d p dp dp d p i , j dp_{i, j} dpi,j 表示前i个字符,左-右= j j j 的方案数,答案为 d p n , 0 dp_{n, 0} dpn,0。若si= ( ( ( 或者 ) ) ) 显然对于任意 d p i , j dp_{i, j} dpi,j 是固定的,故直接继承上一层即可。若为 ? ? ?,则分别加上是 ( ( ( 的方案和 ) ) ) 的方案即可。

E

用一个三维数组记录一下每个位置是哪个块存下标。相邻的两个位置显然满足其中一维的差为 1 1 1 且仅有一维。那么枚举 ( i , j , k ) (i, j, k) (i,j,k),对其相邻的块查看是否有块的存在并且不是他自己的块,如果是就把i的答案里记录一下,相邻的块的所属块也记录一下,用 s e t set set 搞就行。

F

贪心。设物品1,2,3的数量分别为 n 1 , n 2 , n 3 n1, n2, n3 n1,n2,n3 。那么枚举使用 0   n 3 0~n3 0 n3 个物品 3 3 3 的情况下的最大快乐值。贪心的选,那么显然就是在选 1 1 1的是后要取大的,23同理也是。用 n u m 1 , n u m 2 num1,num2 num1,num2 记录一下 12 12 12 的使用数量,如果当前的数量超标就抛弃一个小的。接下来不停的选物品 2 2 2,然后如果当前的这个物品 3 3 3 还可以继续开物品 2 2 2 就并且物品2还有没选的就不停的替换物品 1 1 1(如果比物品1大的话),最后把所有的情况取个 m a x max max 即可。

G

可以发现 ( i , j , k ) (i, j, k) (i,j,k) 的结构一定是如下的:
在这里插入图片描述

那么此时可以想到对于每一个 u ( 1 ≤ u ≤ n ) u(1 \leq u \leq n) u(1un) 统计形式如上图的这样的三元对个数,加到 a n s ans ans 里即可。那么此时可以想到一个类似与 d p dp dp 的思路来处理这个东西。 t 1 , t 2 , t 3 t1, t2, t3 t1,t2,t3分别表示在u的子树中的满足要求的 1 , 2 , 3 1,2,3 1,2,3 元对的个数。遍历的 u u u 的子节点 v v v ,如果 u u u 的辈分高于 v v v,那么显然可选的点数就是 v v v 的子树大小,否则为 n − u n - u nu 的子树大小,设其为 k k k t 3 t3 t3显然是在 t 2 t2 t2 的基础上选一个,即 t 2 × k t2 \times k t2×k t 2 t2 t2 是在 t 1 t1 t1 的基础上选一个,即 t 1 × k t1 \times k t1×k t 1 t1 t1 就加上可选的 k k k 个就行了,把统计完的 t 3 t3 t3 加起来就行了。

AtCoder Beginner Contest 313

A

模拟。

B

类似 f l o y d floyd floyd,若 i > j i > j i>j 并且 j > k j > k j>k 得出 i > k i>k i>k,最后对于 i i i 判断即可。

C

求一下平均值,然后对于余数部分就把后面的减掉,最后加上绝对值之和/2就行。

D

没有看到不能重复。。。。询问 [ 1 , k + 1 ] [1,k+1] [1,k+1] 去掉 [ 1 , k ] [1,k] [1,k] 后的 k k k 个数,得到k组关系,继续询问 [ 1 , k ] , [ 3 , k + 2 ] , [ 4 , k + 3 ] . . . . . [1,k],[3,k+2],[4,k+3]..... [1,k],[3,k+2],[4,k+3].....得到 n − k n-k nk 组关系,通过这些关系就可以推值了,(这里的关系指值相不相等)

E

首先比较明显的是如果有两个非1数挨在一起就会-1。对于有解,因为i作用于i-1,所以考虑倒着统计。记当前的答案为ans,那么显然对于i(1<=i<n),那么消掉他首先由s_i+1拆开(1次)然后是彻底消掉(ans * s_i+1次),加到ans里就行了,记得-1,因为最后一步长度为1的时候不需要操作。

KEYENCE Programming Contest 2023 Summer(AtCoder Beginner Contest 315)

A

对于每一个字符判断即可

B

首先找到他在哪个月,然后算天数就行

C

排个序最大的一定取,然后枚举另一个即可

D

有点没看懂题qwq,但感觉就是模拟,略了

E

感觉很显然的图论,对于一个书就指向所有他要看的,对于一条路径显然就是先看最下面的然后依次往上,所以从 1 1 1 开始往下 d f s dfs dfs 就行了,但是要先 d f s dfs dfs 子节点,因为要先处理要看的。

F

赛时正解想到了,但是细节没处理好挂了了。首先观察到性质:因为2c的增长非常快,可以估计大概当c>30的时候2c已经太大了不可能跳c个成为最优解,所以只需要dp那些c<=30的情况即可。设dp(i, c)表示前i个,跳了c个的最短距离(不包含2^c,赛时这个一起算就挂了),那么我们考虑是从哪个点走过来的设他为k,此时他们之间的点显然都跳了但是我们知道这个数<=30,所以k的取值最多30,所以直接考虑转移柿子,显然就是dp_{k, c-(i-k-1)}+dis(k,i),然后取个min就没了。最后答案就是min(dp_{n,c} + 2^c)

AtCoder Beginner Contest 319

A

存个表直接找就行。

B

枚举 j j j 即可

C

d f s dfs dfs 读法,答案是不失望的读法数 /   9 ! / \ 9! / 9!

D

二分答案裸题, c h e c k check check 就对于每个单词看看要不要换行并更新一下即可,最后判断行数 < = m <=m <=m 即可

E

显然 l c m ( p 1 , p 2 , . . . p n − 1 ) lcm(p_1,p_2,...p_{n-1}) lcm(p1,p2,...pn1) 是个循环,那么只需要处理 0   l c m ( p 1 , p 2 , . . . . , p n − 1 ) − 1 0~lcm(p_1,p_2,....,p_{n-1})-1 0 lcm(p1,p2,....,pn1)1 的答案即可,最后对于每个查询,整的部分直接算就行,零的前面已经预处理过了

ARC165

A

显然当 n n n 有大于 1 1 1 个质因子的时候 Y e s Yes Yes,脑抽挂了 4 发,555

B

首先你排完序以后一定不变或更劣,既然字典序最大,那么就让第一个改变的数的位置尽量靠后。然后有初始最优区间 [ n − k + 1 , k ] [n-k+1, k] [nk+1,k],考虑看看能不能更优秀,设 n o w now now 为当前的尝试的区间的开头,那么如果 p n o w − 1 < p n o w p_{now-1} < p_{now} pnow1<pnow 那么 n o w now now 变成 n o w − 1 now-1 now1 一定不劣,不停的移知道再移动会变劣为止,然后直接操作即可。

ABC320

A

暴力算一算即可。

B

直接找吧,取个max。

C

圆环,所以把每个都复制3遍,然后枚举最后数字相同且位置不同的那三个,设他们的下标为 i , j , k i, j, k i,j,k,则最后的时间为 m a x ( i , j , k ) max(i ,j, k) max(i,j,k),对这个东西取个 m i n min min

D

明显的图论, A i = > B i A_i => B_i Ai=>Bi,走过去就两个坐标分别加上边权的 X i , Y i X_i, Y_i Xi,Yi 即可,刷一遍 d i s dis dis 就行。

E

首先:在队里的人里面编号最小的显然一定排在最前面。然后开两个优先队列 q 1 , q 2 q1, q2 q1,q2 q 1 q1 q1 存不在队里的人的回归时间和编号, q 2 q2 q2 存在队里的人的编号。每次显然就是 q 2. t o p ( ) q2.top() q2.top() 来接,然后踢到 q 1 q1 q1 里存。这里 q 1 q1 q1 就按回来的时间从小到大排,这样具有单调性可以优化不少时间,注意在前面要把归队的全部从 q 1 q1 q1 挪到 q 2 q2 q2 里。

F

f i , j , k f_{i, j, k} fi,j,k 表示到了 X i X_i Xi,正的那趟到这里有 j j j 的油, 反的那趟到这里至少有 k k k 的油的最小花费,那么考虑转移,主导转移好些很多。设 d i s dis dis 为 从 i i i i + 1 i+1 i+1 的耗油数,那么对于 X i + 1 X_{i+1} Xi+1 可以:

  1. 不加 f i , j , k = > f i + 1 , j − d i s , k + d i s f_{i,j,k} => f_{i+1,j-dis,k+dis} fi,j,k=>fi+1,jdis,k+dis
  2. 正着到 X i + 1 X_{i+1} Xi+1 的时候加 f i , j , k = > f i + 1 , m i n ( j − d i s + F i + 1 ) , k + d i s f_{i,j,k}=>f_{i+1,min(j-dis+F_{i+1}),k+dis} fi,j,k=>fi+1,min(jdis+Fi+1),k+dis
  3. 反着到 X i + 1 X_{i+1} Xi+1 的时候加 f i , j , k = > f i + 1 , j − d i s , k + d i s − F i + 1 f_{i,j,k} => f_{i+1,j-dis,k+dis-F_{i+1}} fi,j,k=>fi+1,jdis,k+disFi+1

最后一段路单独领出来用 d p dp dp 处理一下就好了捏:

对于 d p n − 1 , j , k dp_{n-1, j, k} dpn1,j,k ,现在要从 n − 1 n-1 n1 走到 n n n,那么就是看看能不能 n − 1 = > n = > n n-1 => n => n n1=>n=>n 以后油还不小于 k k k,设 d i s dis dis n n n n − 1 n-1 n1 的距离,然后这个就判一下 k ≤ j − 2 ∗ d i s k \leq j-2*dis kj2dis,如果满足就可以,取个 m i n min min

ABC321

A

直接模拟判即可。

B

就从0~100分别 c h e c k check check 一下就好了。

C

直接暴力 d f s dfs dfs 出来所有满足要求的数,然后打表输出即可。

D

二分板子。把 b b b 排个序,对于每一个 i i i 来算他和所有 b j b_j bj 的答案,设最后一个满足 a i + b j ≤ p a_i + b_j \leq p ai+bjp j j j l l l,那么显然 a i a_i ai 就和 [ 1 , l ] [1,l] [1,l] 的和都是不被 P P P 影响的,后面的都是 P P P,前面的用前缀和算一下,后面直接算就行。

E

分为在 x x x 子树内的答案和在子树外的答案。设 f ( n , x , k ) f(n, x, k) f(n,x,k) 表示 n n n 个点 x x x 到其子树内距离为 k k k 的点有多少个。子树内的就是 f ( n , x , k ) f(n, x, k) f(n,x,k),然后枚举一下 x − > u − > y x -> u -> y x>u>y 这个 u u u,显然最多 l o g log log x − > u x->u x>u 是固定的, u − > y u->y u>y y y y 的个数就是 f ( n , u , k − d i s ( u , x ) ) f(n, u, k-dis(u, x)) f(n,u,kdis(u,x)).

F

回退背包板子,没啥好讲的。就 + 的时候把所有的方案数加上 f j − x f_{j-x} fjx- 的时候就做逆操作就行了捏。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/74453
推荐阅读
相关标签
  

闽ICP备14008679号