LOJ3030「JOISC 2019 Day1」考試
顯然的三維數點。
LOJ3031「JOISC 2019 Day1」聚會
這題很 emmmm 啊……
一個其實比較顯然的隨機做法:隨機兩個點 \(x,y\) ,對於每個點 \(z\) 詢問 \((x,y,z)\) ,即可知道它是在鏈上還是在鏈上的某個點的子樹里。
對於鏈上的點可以用 stable_sort
找出之間的順序,子樹內的遞歸處理。
不知道期望多少次,但是過了。
這里還有一個做法,但是沒有看懂……
LOJ3032「JOISC 2019 Day1」饢
反正我想不到 /kk
對於每個人求出對於他來說把 naan \(n\) 等分的分割點,然后每次找到還沒有確定位置的人里面第 \(i\) 個分割點最小的人,把他放在這里。
正確性很顯然。
LOJ3033「JOISC 2019 Day2」兩個天線
這題不會,腦子沒了……
由於是求絕對值的最大值,所以不妨把貢獻設為 \(i<j,H_i-H_j\) ,然后再把 \(H\) 取相反數即可。
離線,從左往右枚舉 \(r\) ,也就相當於是枚舉 \(j\) 。
對於一個 \(i\) ,只有 \(j\in [A_i+i,B_i+i]\) 的時候才是可用的。
而對於 \(j\) ,相當於是對 \([j-B_j,j-A_j]\) 里面可用的 \(i\) 和 \(H_i-H_j\) 取 \(\max\) 。
然后可以線段樹維護:線段樹的一個節點維護最大值、區間可用的 \(\max H_i\) 、區間能貢獻的最小的 \(H_j\) 。
LOJ3034「JOISC 2019 Day2」兩道料理
竟然切了,那就不寫題解了。
https://loj.ac/submission/856564
LOJ3035「JOISC 2019 Day2」???
你LOJ又咕了
題面可以看 https://www.cnblogs.com/zhoushuyu/p/10585809.html 。題解也可以去那里看
考慮兩邊一起做 dijkstra ,那么每次需要知道兩邊分別擴展出的最近點是誰,以及距離是多少,然后選擇較小的那一邊擴展。
那么需要轉移的 bit 是 \(kn\) ,其中 \(k\) 不是很小。
但不管怎樣,數量級已經對了,所以嘗試把 \(k\) 壓小。
一個優化是:先互相傳最小距離,然后距離更小的那一邊把點的編號傳過去。
但是由於距離比較大,還是卡不進去。
發現其實可以傳 \(d'=d-lastd\) ,即比上一次多了多少。顯然這個值不超過 500 。
所以可以做到 \(29n\) 個 bit 做完。
LOJ3036「JOISC 2019 Day3」指定城市
口胡:
不搞那些花里胡哨的,直接上樹形DP:\(dp_{x,i}\) 表示 \(x\) 子樹中選 \(i\) 個,得到的最小代價。
這里的最小代價的意義:假定子樹外還會有特殊點,且只考慮子樹內的邊的貢獻。
顯然在 \(x\) 不是葉子的時候選 \(x\) 沒有任何收益(對於這個dp來說),所以不考慮它。
所以轉移就是給每一個兒子的 \(dp_{v,0}\) 加上 \((x,v)\) 的代價,然后 \((\max,+)\) 卷積合並。
所以容易發現 \(dp_x\) 是凸的,可以用可並堆維護差分,然后 \(O(n\log n)\) 合並。
但是怎樣統計答案呢?
點分治,然后欽定根在虛樹中即可。在根處合並的時候欽定至少有兩個兒子有特殊點,也就是強制選兩個最大的 \(dp_{v,1}-dp_{v,0}\) 。
當然還有一種情況沒有考慮到,就是所有特殊點都在一個子樹中,而根也是特殊點:這種情況對於每一棵子樹單獨處理一下即可。
復雜度應該是 \(O(n\log^2 n)\) 。
正解當然不是這個……
對於選一個或兩個的,可以直接樹形DP。
對於選更多的,有一個結論:\(S_i\subseteq S_{i+1}\) 。所以可以直接貪心選貢獻最大的。
這個結論我好像見過,但是忘掉了……關於證明其實可以看上面那個dp的過程,兩者本質上好像是差不多的,只不過上面的做法強行定了一個根,所以正確性就看起來沒有問題了。
也就是說,在欽定了根的情況下,這個貪心等價於上面的DP。
所以我還是不會證貪心的正確性
LOJ3037「JOISC 2019 Day3」開關游戲
先可以注意到一個性質:在操作序列中,如果相鄰兩個是先區間反轉再區間賦值,那么可以通過一些變換使得把兩者順序調換。
所以必然存在一個最優序列,使得前面都是區間賦值,后面都是區間反轉。
在只有區間反轉操作的情況下,令 \(c=a\oplus b\) ( \(a,b\) 是起始序列和目標序列 ),則答案就是此時的極長 1 段的個數。
區間賦值操作顯然互不相交,所以一格一格DP過去即可。
\(dp_{i,0/1/2}\) 表示 ¥%¥¥……&……%*@ ,然后隨便轉移。
LOJ3038「JOISC 2019 Day3」穿越時空 Bitaro
暴力做法很明顯:只往目標點方向走,能走就走,不能走就等/穿越。
下面只考慮從左往右走。
為了方便,給每個區域一個“時差”:把走到 \(i\) 點的時間減去 \(i\) ,這樣走路的時間就變成 0 了。(當然不做這個轉換也是可以的)
對於一條路,會有兩個分段函數:一是 \(f(x)\) 表示在 \(x\) 時間走進去什么時候能出來;二是 \(g(x)\) 表示 \(x\) 時間走進去需要調整多少次。
顯然 \(f(x)\) 是兩段平,中間 \(f(x)=x\) ;而 \(g(x)\) 是前面平,后面一個斜率為 1 的一次函數。
合並兩條路,發現這樣的形式不會改變,所以就可以線段樹維護了。
LOJ3039「JOISC 2019 Day4」蛋糕拼接 3
險些暴斃 /fad
注意到選出來的蛋糕的順序可以自己定,那么容易發現最小的代價即為 \(2(\max C-\min C)\) 。
所以把蛋糕按 \(C\) 排序,那么就是要選出一段,最大化區間中前 \(m\) 大的 \(V\) 之和減 \(2(C_r-C_l)\) 。
考慮區間 \(m\) 大,可以發現對於 \(l_1<l_2\) ,多加入一個 \(r\) 的時候,給 \(l_1\) 帶來的收益小於等於 \(l_2\) 。
因此,當對於某一個 \(r_0\) ,\(l_2\) 比 \(l_1\) 更優時,對於所有 \(r\ge r_0\) ,\(l_2\) 都比 \(l_1\) 更優。
這就是決策單調性的定義,所以可以分治求出對於每一個 \(r\) ,它的最優的 \(l\) 是誰。
LOJ3040「JOISC 2019 Day4」合並
先把原樹中不合法的邊挑出來。
把這些邊斷掉之后,剩下的連通塊可以縮成一個點。然后再把這些邊連回去。
此時相當於樹上的每一個點的顏色都不相同。可以發現這棵樹是等價於原樹的。
合並兩個點時,它們之間的路徑會被縮到一起。
顯然一次最多縮起來兩個葉子,所以答案下界是 \(\lceil {leaf\over 2}\rceil\) ,而這樣一組解也很容易構造。
LOJ3041「JOISC 2019 Day4」礦物
如果 \(i,j\) 匹配,那么在 \(i\) 在機器里時 \(j\) 怎么變種類數都不會變化,否則怎么都會變化。
容易找到一些 \(O(n\log n)\) 的做法,但是絕大部分由於常數太大被卡掉了。
以下照搬題解。
先用 \(2n\) 次操作,可以把所有石頭分成兩個集合,使得同一個集合的石頭互不相同。
分治,從 \(A\) 集合中選 \(pn\) 個進行 query
操作,然后把 \(B\) 集合依次 query
,即可知道這里面哪些和那 \(pn\) 個是配對的,然后遞歸。
注意 query
操作不需要撤銷也不能撤銷,否則常數就炸了。
總共用操作數為 \(F(n)=F(pn)+F((1-p)n)+(1+p)n\) ,不知道為什么在 \(p={3-\sqrt 5 \over 2}\) 時最優。操作次數大約 980000 次。