代码源2026 CSP-S 模拟赛 Day 18 #C. 城市

子任务1 2的\(15\)分当然可以\(O(n^2log)\)做克鲁斯卡尔

子任务1,2

子任务5的\(15\)分,可以用线性基优化,具体来说:

最开始线性基里一条边也没有,整个图也一条边也没有,互不联通

假如w1=1,这条边是最小的(因为\(w_i\geq 1\)),所以把1放进线性基里,图里添加若干条i<--> i^1 的边。

假如w2=1,这条边也很小,把2放进线性基里,图里添加若干条i<-->i2的边。这样判定xy是否连通,只需要判定xy是否能够用线性基里的1 2 异或得到。

假如w3=3,这条边也很小,但是没有必要管他,因为线性基里已经有了1,2,这说明全体i<-->i1和i<-->i2已经连通,所以全体i<-->i^3也已经连通。

这需要我们小心地对每个w=1,w=2,w=3各维护一个线性基。举例来说,n=6的时候(节点编号012345),w2=1虽然很妙,但是对于5号节点来说没啥作用,因为5号节点想要用上需要和7号节点相连,但是7号节点现在不在。你可能需要等待w1=2或者w4=3这种更长的边,来使得4<-->5或者1<-->5。

子任务5

子任务3

现在回头看子任务3,可以发现子任务3没有这种需求,不需要对每种w各维护一个线性基。所以一个线性基即可解决问题。

子任务3

我去,怎么顺手把子任务5也给过了。应该是数据弱了,比如:

1
5
1 5 3 5 1 1 4 1 

对于这个样例,w[4],w[5],w[7]一起把线性基占满了,而只连通了0 4,1 4,3 4这三条边,无法使得联通。

子任务4

把子任务5的\(w=1\sim 5\)的代码拿出来,vectoro[10]改成map<int,vector>o即可应对w范围更大的子任务4。直接冲过不去,加上题解里的常数优化可以拿到子任务4

子任务4

拼好分

把这个map<int,vector>o代码拼上子任务3可以拿到60分。

60分

100分

考虑把

100分

posted @ 2026-10-14 16:41  zzuqy  阅读(10)  评论(0)    收藏  举报