santisify Site

Back

codeforces 1095 (div3)Blur image

传送门

A. Koshary#

题目描述#

在平面坐标系中两种移动方式向某个轴的正方向走 1 (最多一次)或者 2 步. 问:能否从(0,0)走到(x, y).

解题思路#

因为最多走一次1步,所以可以直接考虑xy是否同时为奇数就可以判定了.

参考代码#

void solve() {
    int x, y;
    std::cin >> x >> y;
    std::cout << ((x % 2 && y % 2) ? "NO" : "YES") << std::endl;
}
cpp

B. Party Monster#

题目描述#

给出一个括号字符串,是否可以对这个字符串重新排列成一个合法的括号序列.

解题思路#

既然是对字符串重新排列,那么只要有成对的()就可以排列成合法的序列.

参考代码#

C. Snowfall#

题目描述#

给定一个数组,现在需要对数组进行排序,使得该数组中的子数组的乘积i=lrai(1lrn)\prod_{i=l}^{r}a_{i}(1\le l\le r\le n) 能被6整除的子数组数量最少.

解题思路#

6整除可以分为两种情况:

  1. ai%6=0a_{i} \% 6 = 0,即aia_{i}6的倍数
  2. (aiaj)%6=0(a_{i} * a_{j}) \% 6=0,即aia_{i}2的倍数(aja_{j}3的倍数)或者aia_{i}3的倍数(aja_{j}2的倍数) >首先可以想到数组中能被6整除的数随意放位置,那么就需要考虑能被23整除的数如何放了,很明显尽可能让23的倍数放在一起.

参考代码#

D. Palindromex#

题目描述#

一个长为2n数组(数组中的数x[0,n1]x \in [0,n-1],并且每个数出现两次)中的所有回文数组的最大mex mex:数组中不出现的最小非负整数. 回文数组:和回文字符串同理,将数组倒置和原数组一致.

解题思路#

想要mex最大,那一定包含数字0,既然每个数都出现两次,那么我们就可以直接找到两个0的位置,回文字符串要么包含其中一个0,要么包含两个0.

  1. 包含一个0,直接向外拓展.
  2. 包含两个0,找到两个0的中心点,向外拓展. >最后取这些情况的最大值即可.

参考代码#

E. It All Went Sideways#

题目描述#

给你一个由 nn 列方块组成的序列,第 ii 列初始有 aiai​ 个方块,竖直堆叠。在重力向右作用后,每块方块会尽量向右滑动,但不能穿过或重叠其他方块,且保持原来的高度。 你可以在重力变化前最多执行一次操作:选择某一列将其方块数减少 1(也可不操作)。

定义“移动的方块”为重力变化后列编号发生变化的方块。

问通过最优操作(或不操作),最多能让多少方块移动。

解题思路#

重力向右后,方块保持高度尽量右移,最终第 i 列的高度等于 (minjiaj)(\min_{j\ge i} a_j)

定义数组 mi[i]=min(ai,,an1)mi[i] = min(a_{i}, \cdots, a_{n-1}),即后缀最小值。

初始总方块数 S = sum(a)。不移动的方块数 = sc = sum(mi),因为每列最底部的 mi[i] 个方块不会改变列编号。 原有移动数 = S - sc。 只能将某一列减少 1,总方块数减 1,同时可能改变后缀最小值。

减少操作的效果等价于:选择一个位置,把该列及其左侧所有列的 mi 值可能降低(取决于是否突破原来的最小值)。

最优操作是找 mi 数组中连续相等的最长段,将该段最左侧那一列减少 1。这样会让该段中每一列的不移动方块都减少 1,新增移动数 = 段长(ma),但总方块数也少了 1,因此净增移动数为 ma - 1ans=(Ssc)+(ma1) ans = (S - sc) + (ma - 1) 其中 ma 是后缀最小值数组中最长连续相等段的长度。

参考代码#

G.Drowning#

思路及参考代码Hailuo4ever

codeforces 1095 (div3)
https://santisify.top/blog/codeforces/cf2227
Author santisify
Published at May 10, 2026
Comment seems to stuck. Try to refresh?✨