同步于洛谷
2016 年 5 月 21 日小奇模拟赛
But this requires giving up our outdated concept of learning from mistakes…even a single mistake is unacceptable and we need to get things right the first time.——月考阅读D篇
写挂不能是借口,数组开小不能是借口,变量写错不能是借口,初始化和边界没有考虑完全不能是借口,前后句逻辑上写反也不能是借口……不能犯任何不该犯的低级错误,这才是程序思维,也只能是。
题目分析
T1 小奇的树
原题BZOJ3784 树上的路径(lydsy挂了所以没挂链接)
题意
给定一棵n个节点的有根树,求前m大的路径。
思路
只知道打暴力。还因为作死手玩heap丢了到手的30分。暴力很好打,把所有的路徑存到大根堆裏面即可。關於鏈的子任務可以記錄最長鏈和次長鏈,或者DP(from lightmain
),這裏不再贅述。
正解
首先我們看一道線性版本——超級鋼琴。 這羣神仙是怎麼想到這種神仙做法的(先看題目再回來做過的當我沒說)
對於超級鋼琴,首先我們的想法都是暴力——記錄所有的優美度。顯然有
N
2
N^2
N2級別個和絃,不僅TLE而且MLE。那麼我們要怎麼減少需要記錄的信息呢?從要素入手:一個和絃有一個左端點和右端點,優美度即前綴和相減———那麼———考慮前綴和(?)———一個化無序爲有序的想法:固定左端點,考慮右端點(!),這樣不就是求區間最大值嘛!設一個三元組
(
x
,
l
,
r
)
(x,l,r)
(x,l,r),爲【以
x
x
x爲左端點,找到一個在
[
l
,
r
]
[l,r]
[l,r]區間內的
t
t
t使得兩個前綴和相減的值最大】,即
f
(
x
,
l
,
r
)
=
max
l
≤
t
≤
r
(
s
u
m
[
t
]
−
s
u
m
[
x
−
1
]
)
f(x,l,r)=\max\limits_{l\leq t\leq r}(sum[t]-sum[x-1])
f(x,l,r)=l≤t≤rmax(sum[t]−sum[x−1])。初始化即把所有的
f
(
x
,
x
+
1
,
n
)
,
1
≤
x
<
n
f(x,x+1,n),1\leq x< n
f(x,x+1,n),1≤x<n扔進大根堆。注意!取走了
s
u
m
(
k
)
−
s
u
m
(
x
)
sum(k)-sum(x)
sum(k)−sum(x)後,還有可能有
f
(
x
,
l
,
k
−
1
)
f(x,l,k-1)
f(x,l,k−1)和
f
(
x
,
k
+
1
,
r
)
f(x,k+1,r)
f(x,k+1,r)對答案有貢獻。那麼大根堆裏面應該記錄的是四元組
(
x
,
l
,
r
,
f
(
x
,
l
,
r
)
)
(x,l,r,f(x,l,r))
(x,l,r,f(x,l,r))。
同理,我們把這個思想放到樹上,用點分治維護一下dfs序。這裏把所有生成的路径放到一個數組裏面。
對應的
x
x
x是一個點,
s
u
m
(
x
−
1
)
sum(x-1)
sum(x−1)改成點
x
x
x到分治中心的距離,
(
l
,
r
)
(l,r)
(l,r)是在這個分治中已經到達過的点与分治中心的路径組成的區間,
f
(
x
,
l
,
r
)
f(x,l,r)
f(x,l,r)不言而喻。
這題就做完了。
T2 小奇的图
需要使用LCT。然而现在我还不会。。。
所以正解现在不会写,只是说一说一些技巧。
题意
(抄的原题)给定 n 个点(编号为 1-n),由 m 条无向边连接的图,每个点有两个权值 ax,bx,给定一个值 k,要求在图中选出大小为 k 的点集 S,使 S 中任意两点间存在仅经过在 S 中的点的路径。设 As 为点集 S 中 ax 的最大值,Bs 为 S 中 bx 的最大值,求一个合法的 S 使得 As+Bs 最小。
技巧
使得As+Bs最小,看起来没有什么可以直接看出来的规律,然而我们总是要化無序爲有序——贪心;而选一个点集 S ,就是维护一个联通块,那么大概可以想到一种枚举点的顺序什么叫大概可以:将点用ax值从小到大排序,然后逐渐加点,直到最大的联通块的size达到k以上——这时,用单调队列维护bx值,从大到小删点,直到再删一点就不能满足size大于等于k为止,此时记录答案。
用LCT维护这棵(最小生成)树的size即可什么什么。注意要把点的权值转化成维护边的权值,用两点中bx权值大的赋值边权即可。
T3 crisis
震惊,模拟竟然有90分。
题意
多次查询有边权的树上距离点x最近在[l,r]中的点的距离。
思路
只会打暴力。每次以x为根深搜一遍找最近的。(但是为什么ovor
能跑极限数据艹)
正解
对每一个分治中心开一棵动态开点线段树,然后每次在分治中心查询[l,r]中的距离取min。这样一定可以忽略劣解。
考试总结
数据结构用得太少了,而且也不熟悉,导致考试根本不会用。更别说没学会的了。
要学会怎么处理数据,掌握化无序为有序的思想。