CQBZ Weekly Contest
简称:CWC
考得那么差不写总结过不去……
Round 1 \text{Round } 1 Round 1
Score \text{Score} Score
50 + 60 + 100 + 0 + 70 + 3 + 5 = 288 50+60+100+0+70+3+5=288 50+60+100+0+70+3+5=288
Looking Forward \text{Looking Forward} Looking Forward
差。
本来 T1 T2 都是想到的正解,结果因为细节丢了 90 p t s 90pts 90pts……而且居然没有检查出来。
T3 确实挺妙的,可能是我对二分比较熟练。
T4 在考试的时候推得很复杂,就没去想了。最好的办法应该是从头在想一遍。
gm曾说:这次比赛暴露出了很多问题。
比如,对知识点的忘记,板子不会打的离奇情况。
于是 T5 打了个暴力,T7 基本想到正解但是没调对……
Solution \text{Solution} Solution
A A A
一道常规的模拟题,考试的时候花了 30min。
可以先预处理出每一行的单词,再处理空格。
注意:
-
空格的数量。
-
最后一行的输出。
B B B
一道基础思维题。
贪心地想,我们尽量一次只去掉一个 1 1 1
最优的情况就是 1 1 1 的个数,设为 x x x。
可是不然。需要考虑什么影响了操作。
一次只去掉 1 1 1 个 1 1 1 显然前提是 在 2 × 2 2\times 2 2×2 的矩阵中,有至少 2 2 2 个 0 0 0。容易验证。
那么如果只有一个 0 0 0,我们第一次覆盖就是要覆盖 2 2 2 个 1 1 1,所以答案为 x − 1 x-1 x−1。
另外一种情况是全部是 1 1 1,同上可推出是 x − 2 x-2 x−2。
总结一下,本题的主要思路就是:
因为 0 可以扩展,所以只要有一个 2 × 2 2\times 2 2×2 满足则可以推到其他 2 × 2 2\times 2 2×2。
C C C
最暴力地,枚举区间左右端点,再对区间进行排序,再进行验证。复杂度为 O ( n 3 log n ) O(n^3\log n) O(n3logn)。
而我们要优化到 O ( n log n ) O(n\log n) O(nlogn) 以下。
这种区间问题,通常的解决方法就是 数学计数 或 一端点+另一点二分。这是题外话。
注意到 “第 k k k 小的数大于等于 x x x”,直接求非常复杂。我们可以把它转换为:最多有 k − 1 k-1 k−1 个数小于 x x x。
又可以转化为:区间内大于等于 x x x 的数量为 l e n − k + 1 len-k+1 len−k+1。
怎么求这个区间范围内的数量呢?自然想到前缀和。
于是现在,对于一个区间 [ l , r ] [l,r] [l,r],我们可以在 O ( 1 ) O(1) O(1) 的时间内判断它的合法性了。但是这样也是 O ( n 2 ) O(n^2) O(n2)。
观察样例并思考,发现这玩意具有单调性,满足:
对于固定的 i i i,若 j j j 满足条件,则 [ j + 1 , i − k + 1 ] [j+1, i-k+1] [j+1,i−k+1] 都满足条件。
证明:
将 j j j 变大后。
-
第 k k k 小数在最前面,即不在新区间内了,则新的第 k k k 小数会变大,由不等式传递性得出正确性。
-
还没有被去掉。则讨论去掉的数与 k k k 小数的大小关系。若该数小于第 k k k 小数,则同上证法。若大于,则不会影响比它小的数。证毕。
证明了单调性,就可以二分了。
枚举右端点 i i i,二分最小的左端点,然后计算区间的长度即可。时间为 O ( n log n ) O(n\log n) O(nlogn)。
D D D
首先,我们想让所有段的长度为 1 1 1。
随后任何的更改操作,都可以看作是取反。
我们需要取反一些数使之和 0 0 0。
这里的取反,指的是对于 i i i 和 i + 1 i+1 i+1,通过取区间 [ i , i + 1 ] [i,i+1] [i,i+1] 使 i + 1 i+1 i+1 由 − - − 变为 + + + 得到。
所以如果 i + 1 i+1 i+1 要取反,那么 i i i 就一定不能取反。
无解好判断,当所有 1 1 1 或 − 1 -1 −1 的数量为单数时,无论怎么变都变不到 0 0 0。
E E E
线段树板子。
F F F
设 d p i , j , 0 / 1 / 2 dp_{i,j,0/1/2} dpi,j,0/1/2 表示当前节点为 i i i,当前子树中有 j j j 个颜色 K K K, i i i 的颜色小于/等于/大于 K K K 的方案数。
初始化: d p i , 0 , 0 = k − 1 , d p i , 1 , 1 = 1 , d p i , 0 , 2 = m − k dp_{i,0,0}=k-1,dp_{i,1,1}=1,dp_{i,0,2}=m-k dpi,0,0=k−1,dpi,1,1=1,dpi,0,2=m−k
c r < K c_r<K cr<K 时,子树随便怎么选。
d p i , j , 0 = ∑ t o d p i , j − k , 0 × ( d p t o , k , 0 + d p t o , k , 1 + d p t o , k , 2 ) dp_{i,j,0}=\sum _{to} dp_{i,j-k,0}\times(dp_{to,k,0}+dp_{to,k,1}+dp_{to,k,2}) dpi,j,0=to∑dpi,j−k,0×(dpto,k,0+dpto,k,1+dpto,k,2)
c r = K c_r=K cr=K 时,儿子节点要小于 K K K。
d p i , j , 1 = ∑ t o d p i , j − k , 1 × d p t o , k , 0 dp_{i,j,1}=\sum _{to} dp_{i,j-k,1}\times dp_{to,k,0} dpi,j,1=to∑dpi,j−k,1×dpto,k,0
c r > K c_r>K cr>K 时,儿子节点不能选 K K K。
d p i , j , 2 = ∑ t o d p i , j − k , 2 × ( d p t o , k , 0 + d p t o , k , 2 ) dp_{i,j,2}=\sum _{to} dp_{i,j-k,2}\times( dp_{to,k,0}+dp_{to,k,2}) dpi,j,2=to∑dpi,j−k,2×(dpto,k,0+dpto,k,2)
转移中要用到 d p i dp_i dpi,并且是之前的还没有考虑当前子树的 d p i dp_i dpi,而转移过程中, d p i dp_i dpi 的值会被改变且重复利用,所以,我们需要一个另外的数组暂时用来记录转移的答案,转移完后再复制给 d p i dp_i dpi。这样就解决了有后效性的问题
G G G
首先,一定不选割点。
每个点双肯定只选一个且最小。
走到最后的时候,必然剩下一个点双,而这个点双友其它点双的点经过割点到达,所以这一个点双就可以不安排。
我们可以用总共的最小值和减去度数为 1 1 1 的最大的值。
Round 2 \text{Round 2} Round 2
Score \text{Score} Score
真实分未知。
估: 69 + 100 + 100 + 70 + 0 + 22 = 361 69+100+100+70+0+22=361 69+100+100+70+0+22=361
Looking Forward \text{Looking Forward} Looking Forward
T1 又粗心了。
T4 没有考虑溢出。
T5 和 T6 都没有认真去想。
比上一次好了很多。 ?
对于难题不能畏惧。勇敢去做。
千万不要以为把前面简单题拿稳就可以了,况且你还不能保证拿稳……
Solution \text{Solution} Solution
A A A
先确定每个数字代表的方向,共 24 24 24 种。
然后跑一遍即可。
B B B
定义 d p i dp_i dpi 表示到达第 i i i 列的方案数。分类讨论。
-
当前为竖着的。
- 前面也是竖的: d p i = 2 d p i − 1 dp_i=2dp_{i-1} dpi=2dpi−1
- 前面是两个横: d p i = d p i − 1 dp_i=dp_{i-1} dpi=dpi−1
-
当前为横着的左边。
- 前面是竖的: d p i = 2 d p i − 1 dp_i=2dp_{i-1} dpi=2dpi−1
- 前面两个横: d p i = 3 d p i − 1 dp_i=3dp_{i-1} dpi=3dpi−1,此处需要注意。
-
当前为横着的右边。 d p i = d p i − 1 dp_i=dp_{i-1} dpi=dpi−1
C C C
考虑最小且不出现,尽可能考虑 0 0 0。
贪心地把 0 0 0 和其他数隔一个摆放。如果数量够答案为 0 0 0。
否则,已经有了 0 0 0。考虑将所有的 0 0 0 放在最右边。其他的放左边。
这样如果不全是 1 1 1,那么答案就是 1 1 1。如果全是 1 1 1,则必然有一个 1 1 1 和 0 0 0 结合形成 1 1 1。为了避免 2 2 2,则需要间隔摆放,为 2 2 2。
D D D
数学题。
首先,一个重要的转化:
888...888 = 8 9 × 999...999 = 8 9 ( 1 0 x − 1 ) 888...888=\dfrac{8}{9}\times 999...999=\dfrac{8}{9}(10^x-1) 888...888=98×999...999=98(10x−1)
其中 x x x 表示位数。
L ∣ 8 9 ( 1 0 x − 1 ) L \mid \dfrac{8}{9}(10^x-1) L∣98(10x−1)
9 L ∣ 8 ( 1 0 x − 1 ) 9L \mid 8(10^x-1) 9L∣8(10x−1)
d = ( 8 , L ) d=(8,L) d=(8,L)
9 L d ∣ ( 1 0 x − 1 ) \dfrac{9L}{d} \mid (10^x-1) d9L∣(10x−1)
1 0 x ≡ 1 ( m o d 9 L d ) 10^x \equiv 1 \pmod {\dfrac{9L}{d}} 10x≡1(modd9L)
引理:欧拉定理
若 ( a , m ) = 1 (a,m)=1 (a,m)=1, a φ ( m ) ≡ 1 ( m o d m ) a^{\varphi(m)} \equiv 1 \pmod m aφ(m)≡1(modm)。
所以我们只需要令 y = φ ( 9 L d ) y=\varphi(\dfrac{9L}{d}) y=φ(d9L),找到那个最小的 x ∣ y x \mid y x∣y 即为答案。
快速幂会爆 long long
,记得开龟速乘。
E E E
对于此类删除的题,常见的转化思路是倒着来,改删除为添加。
按照边的权值从大到小排序。
每次对于一条边 ( x , y ) (x,y) (x,y),判断 x , y x,y x,y 是否已经联通。
若没有联通:
-
添加这条边
-
计算这条边对答案的贡献。设 s i s_i si 表示联通块 i i i 的大小,则这条边使得 x , y x,y x,y 各自的 s x , s y s_x,s_y sx,sy 个点两两之间联通。 即 s x × s y s_x\times s_y sx×sy 个点对。
权重?添加这条边后,两块联通。说明删掉这条边后刚好断开,前面还删除了比它权值小的边。所以边权应该是小于等于当前边权的边的边权和。可以用前缀和。
所以这条边对答案的贡献为 s x × s y × p r e v s_x\times s_y\times prev sx×sy×prev。
联通和块长可以用并查集维护。
F F F
一眼数论,但并不是这样。
对于均为奇数的 a i , a j a_i,a_j ai,aj,各自加一后同为偶数,则满足条件。偶数同理。
所以:奇数和奇数可以选,偶数和偶数可以选,奇数和偶数看情况。
很容易联系到图。并且分为奇数和偶数,奇数各不影响,偶数同理,就是一个二分图。
于是:对于奇数的 a i a_i ai,将其放入左部;偶数放入右部。为了使左右两部内部没有边,于是考虑反着建:将不满足条件的,即 ( a i , a j ) ( a i + 1 , a j + 1 ) = 1 (a_i,a_j)(a_i+1,a_j+1)=1 (ai,aj)(ai+1,aj+1)=1 的进行连边。
最终求出最小独立集即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现