NOI模擬賽 #4
好像只有一個串串題可以做...
不會 dp 和資料結構啊 QAQ
10 + 20 + 100 = 130
T1
一棵樹,每個點有一個能量的最大容量 $l_i$ 和一個增長速度 $v_i$,每次可以選一個點,給 q 個時刻,每次把這個子樹裡和它距離不超過 k 的點的能量全都拿走,求每次拿走了多少
$n,q \leq 152501$
$Time \space Limit : 4s$
sol:
暴力常數小即可 70,常數大(我)只有 20
被 yyc 爆踩辣
(為什麼你會這麼熟練啊!你到底寫過多少暴力了 QAQ
subtask 1.沒有最大容量
對於每個點,將 (dfs序,深度) 作為二元組搞到矩形裡,每次拿走的是一個矩形,
用 kd 樹維護這些點即可
每次期望影響 $\sqrt{n}$ 個矩形和 $\sqrt{n}$ 個單點,複雜度 $O(卡不掉)$
subtask 2.一條鏈
構造一個關於“最後一次採摘時間"的序列
進行一次操作最多讓這個序列的段數改變 2
就比如說有可能 002200 -> 044200 -> 554200
對於每個區間開一個三元組 $(l,r,x)$ 表示區間 $[l,r]$ 最後一次採摘的時間是 $x$
每次相當於每次拆開兩個三元組,對它們中間的計算答案,顯然中間的整段可以一起計算
現在的問題就是對於 $(l,r,x)$ 和 $(l,r,t)$ ,能拿到多少能量
分類討論, 如過 $\lceil \frac{l_i}{v_i} \rceil \leq t$,那就是 $\sum l_i$
否則就是$t \times \sum v_i$
用一個平衡樹維護這些區間,然後用主席樹查一遍區間有多少小於等於 $k$ 的元素就可以了
subtask 正解
還是 kd 樹,搜出來一定是 $\sqrt{n}$ 個子樹和 $\sqrt{n}$ 個單點,單點隨便做一做
對於子樹可以暴力遞迴下去找到“都被修改過”的子樹
然後主席樹合併,通過亂七八糟的複雜度分析大概是 $O(nlogn + q \sqrt{n} logn)$
這也是 $Time \space Limit : 4s$ 而且被暴力過了的原因
duliu
T2
給 $n$ 個點的座標 $p_i$,每個點的引數 $a_i,b_i$和一個 $k$,第 $i$ 個點可以跳到標號為 $[i+1,i+k]$ 的點 $j$,代價為 $|p_i - p_j| \times b_i$,每到一個點,就會在這個點停留 $a_i$,求 $1$ 跳到 $n$ 的最小代價
$n \leq 152501$ 座標範圍不超過 $152501$
sol:
subtask 1.k=n
分類討論
當 $p_i ≥ p_j$ 時,要求 $f_j - p_j \times b_j + p_i \times b_j$
設一條直線 $y = (b_j) x + (f_j - p_j \times b_j)$,把 $p_i$ 帶進去就是答案
用一個李超樹維護直線就可以了
subtask 正解
王 · 線段樹分治 · 子健
線段樹分治,然後就變成了上一個 subtask,撤銷跟並查集一樣,用一個棧維護所有操作, 撤銷那幾個操作的影響即可
$O(nlog^3n)$ 看似不怎麼可過,但李超樹的兩個 log 跟一個 log 差不多,所以可以過
T3
定義 $f(S)$ 為字串 $S$ 的 kmp 樹上每個點的深度和(根的深度為 $1$),給 $q$ 個詢問,每組一個 $m$ ,求 $\sum_{1 \leq l \leq r \leq m} f(S[l \cdots r])$
$|S| \leq 152501,q \leq 152501$
sol:
要求一個字首和,差分一下,就是要求一個串後加一個新字元,kmp 樹的深度和
於是再差分一下,變成了一個點在 kmp 樹上的深度,這個能 fail 多少次就是多少,相當於它在這個字首裡出現的次數
然後就相當於一個字串,每次新增一個字元,詢問一個字尾出現了多少次
那就是字尾自動機板題,結尾相同的所有子串是一條 parent 樹上的鏈,維護一下這條每個點的 endpos 集合的大小即可
然後就是一個鏈加 & 鏈查詢
樹鏈剖分 / LCT / 全域性平衡二叉樹即可