2022 CCPC 威海站
成功打星(
不过还是有不尽人意的地方,赛中B题没有给调出来,比较缺乏写暴力的能力。L题比较简单的线性代数也没能想出来。一直在往比较麻烦的贪心上想。
做不出来需要及时更换另一种思路!
A. Dunai
一个比较简单的题目,但我没想好直接WA了一发。
显然只有两种限制:每个种类的制约,以及获得过冠军的总数。
两者求 min 就OK了。
B. Recruitment
可以发现,当 $s_i-1=s_{i+1}$ 时,$x+y-xy=1$。即 $(x-1)(y-1)=0$,$x,y$ 里面至少一个 $1$。
那么只有大于 $1$ 的点是有用的。而 $\prod x_i=s_{n-1}\le 10^9$,那么有用的状态就很少了。
于是直接从开始搜索,用 map<vector<int>,status>
记录所有状态以及前驱就ok了。
需要注意一些细节,及时判掉不合法的状态。
1 |
|
C. Grass
$5$ 个点有解当且仅当这 $5$ 个点不共线。
随便找到五个不共线的点,然后枚举 $A$ 点构造即可。
D. Sternhalma
一眼状压DP,不过建图非常麻烦。
可以在图的左下角加多一个三角形就方便很多了。
E. Python Will be Faster than C++
签到题。
F. Mooncake Delivery
将一条路径分为若干个极大相同颜色连续段,一条路径的权值等于(连续段权值和+下一个点的点权)的最大值。
对于相同颜色的点,用Floyd求出两两最短路,然后建一个新图,$(u,w)$ 边权为:枚举与 $u$ 相同颜色的点 $v$ 且 $(v,w)\in E$,连边 $(u,w,dis_{u,v} + val_w)$。
在新图上跑最大值的Floyd即可。
G. Grade 2
发现 $k$ 中大于 $2^{\text{Popcount(x)}}$ 的是没用的,也就是构成一个 $2$ 的次幂的循环节。
然后预处理一下就OK了。
H. Party Animals
留坑。。。
I. Dragon Bloodline
由于每种是 $2^i$,那么贪心就是正确的,因为肯定存在某种最优解是贪心的策略。
于是二分,然后从大到小贪心就ok了。
J. Eat, Sleep, Repeat
可以发现,所有的数都不能越过 $limit_x=0$。
用 $limit_x=0$ 分段,然后统计次数的奇偶性就ok了。
K. I Wanna Maker
对于 $1$ 条件,可以合并成一个。
对于 $2$ 条件,可以枚举左端点的区间,然后右端点的合法方案数是一个分段函数。
L. Novice Magician
首先,若 $\sum b_i$ 不被 $2^{n-1}$ 整除,那么无解。
将 $2,4,6,\cdots$ 这些随便分配到要操作的数中。
那么,每次操作相当于给一半的数加 $x$。
那么相当于要构造一个 $2^n\times 2^n$ 的矩阵 $A$,使得每一行中恰好有一半的是 $1$,一半是 $0$。满足 $xA=b’$ 有整数解,其中 $x,b’ $ 是 $1\times 2^n$ 的矩阵。
若 $A$ 必须有逆,则可以直接求出来。也就是这 $2^n$ 个向量线性无关。
可以如下构造($n=3$):
$$
A = \begin{bmatrix}
1 & 1 & 1 & 1 & & & & \
& 1 & 1 & 1 & 1 & & & \
& & 1 & 1 & 1 & 1 & & \
& & & 1 & 1 & 1 & 1 & \
1 & 1 & 1 & & & & & 1\
& 1 & 1 & 1 & & & & 1\
& & 1 & 1 & 1 & & & 1\
& & & 1 & 1 & 1 & & 1
\end{bmatrix}
$$
这样就一定有逆元,打表找找逆元的规律就可以了。
1 | const int N = 2050; |
M. String Master
为了让字典序最大,我们需要让一尽可能地多。
先去掉一些边边角角的情况。
然后考虑枚举开始时二进制的长度 $i$,枚举从第 $j$ 位开始。贪心,从 $j$ 开始选,为了字典序最大,我们要使得 $j\sim 0$ 位都是 $1$。
然后写一堆比较函数之类的就ok了。
1 | const int M = 59; |