T1 「JOI 2021 Final」有趣的家庭菜園 4
顯然我們先求\(A\)數組的差分
那么顯然最后就是要讓一段前綴的差分\(>0\),剩下的\(<0\)
不難發現一個操作是讓至多一個差分\(+1\),至多一個差分\(-1\)
於是枚舉波峰算兩側所需次數的\(max\)即可
T2 「JOI 2021 Final」雪球
顯然每個雪球的覆蓋雪的范圍是一段包含自己但不會超過他上一個/下一個點的區間
直接記錄前綴最大/小值就能二分出區間的左右端點了
顯然可以\(O(nlogn)\)但是懶人就是要\(O(nlog^2n)\)
T3 「JOI 2021 Final」集體照
注意到關鍵的條件就是所有人的身高構成排列
於是最后的狀態里
必然存在\(T\)個區間\([l_1,r_1],[l_2,r_2]....[l_T,r_T]\)
滿足\(l_i=r_{i-1}+1\)
且\([l_i,r_i]\)里填的數恰好是\(r_i\)到\(l_i\)依次遞減
考慮一種最終的狀態\(b[1..n]\)的貢獻
假設原來的\(i\)在\(p_i\)位置
那么次數就是\(\sum_{i=1}^{n} \sum_{j=i+1}^{n} (p_{b[i]}>p_{b[j]})\)
於是設\(f[i]\)表示以\(i\)為某個區間結尾的最小代價
轉移就枚舉最后一個區間的長度,用樹狀數組轉移即可
T4「JOI 2021 Final」機器人
不難發現如果我們想要通過一條邊只有兩種選擇
\(1\)、把他的顏色換成一種新的顏色
\(2\)、把所有和他顏色相同的換成一種新的顏色
於是建邊為兩者的最小值dijkstra即可
發現有一種特殊情況
就是我們連續走過兩條邊,在上面分別用\(1\)和\(2\)操作,如果兩次操作的邊顏色相同,不難發現這樣算會多算一次第一條邊的貢獻
於是我們對於每條邊拆出一個點,\((u,v,c,p)\)就拆出\((v,c)\)這個點
抄張圖
設\((u,0)\)為原圖中的\(u\)這個點
把\((u,0)->(v,c)\)連費用為\(0\)的邊
\((v,c)\)向所有\(v\)能通過顏色\(c\)到的點連上那條邊只有\(2\)操作的權值
不難發現\((u,0)->(v,0)->(w,0)\)先\(1\)再\(2\)且顏色相同就變成了
\((u,0)->(v,c)->(w,0)\)
答案就算對了,並且不會增加新的轉移方式
T5「JOI 2021 Final」地牢 3
不難想到一個貪心策略
我們考慮當前位置的\(i\)下一個比我這里加能量便宜的位置\(j\)
如果\(i\)到\(j\)的距離是\(d\),那么把能量加到\(min(u,d)\)顯然最優
於是我們就得到一個\(O(nq)\)的優秀做法
考慮優化它
先考慮\(sub3\)的情況,所有的\(T\)都是\(n+1\)
我們考慮離線按左端點\(S\)從大到小離線處理
我們維護一棵線段樹下標\(i\)就表示最大容量是\(i\)時的答案
我們考慮左端點左移了\(1\)個單位的改變
維護一個從左到右遞減的單調棧
當我們彈出棧頂時我們發現,如果我們的\(U\)大於棧頂到當前的左端點的距離\(L\)的話
我們顯然在當前位置會多加一些能量(原來加能量一定會加滿到剛好到在那個位置)來替換更劣的價格
於是我們會給\(U\)以后的減去一個折線,來扣掉那部分的貢獻
具體而言設當前左端點到棧頂的下一個位置的距離是\(L1\)
那么對於一個大於\(U\)的位置\(x\),他會減去\((min(x, L1) - L) \times\)棧頂加能量的代價
那么最后我們肯定是要把當前買能量的貢獻加上
具體而言設當前位置到棧頂的距離是\(L\)
那么任意一個位置\(x\),他會加上\(min(x,L) \times\)當前加能量的代價
為了卡常更好寫,我們顯然可以用兩個樹狀數組代替線段樹
接下來考慮\(sub4\)
對於區間\(S\)到\(T-1\),我們找到距離\(T\)小於等於\(U\)的位置里,代價最小的點\(mid\)
我們發現不管是從\(S\)到\(T\)還是\(S\)到\(n+1\),我們都一定會在\(mid\)這里加油
簡單推導不難發現\(ans(S,T)=ans(S,n+1)-ans(mid,n+1)+(mid到T的距離 \times mid這里加油的代價)\)
於是就轉化成了\(sub3\)的問題