1. 程式人生 > >NOI模擬賽 #4

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 / 全域性平衡二叉樹即可