Day 1
什么?今天要比赛?毫无心理准备,害怕场上板子打不出来。
果断开题。
A是大水题,切掉。测了一下大样例,过了,就没有多管。
B貌似并不难,直接 d p dp dp即可,期望得分 70 70 70分。
然后看C,我们可以直接 O ( k 2 ) O(k^2) O(k2)暴力,另外特判一下链的情况即可。期望得分 80 80 80分。
看来 r k 1 rk1 rk1是我啦!开心……
待会儿测大样例有你好受的
B B B大样例没过,而答案却偏小?什么鬼?
并不慌地自造了一个样例,果然没过。经过简单的检查,发现——本题一个人不能被多次援救!如果你援救了同一个人正好 k k k此,那你会认为所有人都被援救了!
所以显然简单 d p dp dp不行。经过简单的思考,开始打暴力。
暴力打了 20 20 20分钟,代码才写了 40 40 40行(太菜了),于是删掉了暴力代码,去看 T 3 T3 T3。
反正没事, C C C应该没什么问题, 100 + 0 + 80 = 180 100+0+80=180 100+0+80=180应该也有一个好名次。
但是 C C C又炸了!
什么鬼啊,回去看了一眼,立即发现——
没有正确特判那两个条件。
然后在草稿纸上画了半小时,无果,放弃。
回去只好搞 T 1 T1 T1,并没有发现什么问题。最后,难受地交了。
我太菜了,
r
k
1
rk1
rk1永远不是我了
期望得分:
100
+
0
+
0
=
100
100+0+0=100
100+0+0=100
实际得分:
60
+
0
+
0
=
60
60+0+0=60
60+0+0=60。
(
r
k
1
rk1
rk1,只不过是倒数的)
我 T M TM TM不知道我在干啥!!!
唉,如果要比菜的话,那我能吊打天下所有人。
Day 1.5
g h gh gh巨佬讲题。
T1
我们考虑开桶。对于每一个 i i i,我们在桶中找到是 i i i倍数的数有多少个,记这个值为 v i v_i vi,显然这些数的最大公约数一定不小于 i i i;然后,对于每次询问的值 k k k,我们只需要找到 v i v_i vi不小于 k k k的所有 i i i中的最大值,我们可以通过简单的预处理完成。时间复杂度为调和级数,时间复杂度 O ( m l o g m ) O(mlogm) O(mlogm),其中 m = m a x 1 ≤ i ≤ n a i m=max_{1≤i≤n}{a_i} m=max1≤i≤nai。
这不就是我思路吗?
于是,怒喊改分数。讲课的 g h gh gh神犇看了看我的代码,接着说了一句话:
“ c o u t cout cout没有 p r i n t f printf printf快啊”
看了一眼我的代码,发现竟然sb地用cout输出了 1 0 6 10^6 106个数?!!快读记住了,快输却忘记了!还有谁比我菜???!!!
心态炸了,唉……
T2
对于每一个 d i d_i di,我们跑一遍 D i j k s t r a Dijkstra Dijkstra。然后,我们就可以直接上 d p dp dp了。
d p dp dp状态转移就是状压的套路式:
状态设计: d p x , s t a t e : dp_{x,state}: dpx,state: 目前到了 x x x这个节点, s t a t e state state表示各个节点是否到达过的二进制状压数。
状态转移: d p v , s t a t e = d p u , s t a t e + c n t ( s t a t e ) × d i s u , v dp_{v,state}=dp_{u,state}+cnt(state)×dis_{u,v} dpv,state=dpu,state+cnt(state)×disu,v,其中 c n t ( s t a t e ) cnt(state) cnt(state)表示在二进制数 s t a t e state state中 1 1 1的个数, d i s u , v dis_{u,v} disu,v表示 u u u到 v v v的最短路径的长度。
总时间复杂度 O ( k ( n + m ) l o g m + 2 k k 2 ) O(k(n+m)logm+2^k k^2) O(k(n+m)logm+2kk2)。
听完之后茅塞顿开。唉,这么水的题都做不出来了,要 T G 4 = TG 4= TG4=预定了。
T3
对我表示无语。
首先,在考场上写了 T 3 T3 T3链的部分分,特别好写,前缀和维护 30 30 30行写完。但是,犯了一个 s b sb sb错误——每次我们单点修改的是节点 m i n ( u , v ) min(u,v) min(u,v),而不是 u u u!
然后,听了 g h gh gh巨佬讲题。
我们可以发现,对于一条链 u , v u,v u,v,能够扩展出这条链的链一定走了 l c a ( u , v ) lca(u,v) lca(u,v)的到 u , v u,v u,v的子边。我们每次单点修改即可。
考虑查询,假设我们枚举到的链是 ( u , v ) (u,v) (u,v),那么所能扩展出来的节点数量就是 u u u到 v v v的路径上各边权之和,这个显然可以用前缀和 O ( n ) O(n) O(n)预处理+ O ( 1 ) O(1) O(1)查询完成。
总时间复杂度 O ( m l o g n ) O(mlogn) O(mlogn),若用 T a r j a n Tarjan Tarjan求 L C A LCA LCA,可以将时间复杂度优化为 O ( n + m ) O(n+m) O(n+m)。
Day 2
总结一波。
本场比赛中途过于骄傲,自以为已有 250 250 250分(话说我真的好二五)。事实上,思路都是胡扯,另外 T 1 T1 T1还忘记了卡常,sb地使用了 c o u t cout cout。
想吃屎,唉