有些題不會,咕咕咕。
Day1T2
發現當\(1\)的方向確定后,其它點的方向都確定了。可以考慮病毒隨便可以走,一個人必須沿着一個方向一直走下去,看這個病毒是否有可能追上這個人。發現可能的方向唯一。
用喜歡的方法模擬即可。
Day1T3
離線做法:對於一個隊列\(x\),通過離線可以維護出從頭到尾加入了什么,對於一個詢問求出在隊列上的區間\([L,R]\)。處理\(L,R\)可以用吉司機線段樹。
在線做法:同樣用吉司機線段樹維護出\(L\)。用主席樹來維護在某個時間中一個隊列中加入過多少個數。查詢的時候先二分時間,然后在主席樹上查得到加過多少個數,然后比較一下。這部分時間\(O(n\lg^2 n)\)。
Day2T1
首先求出從每個點出發,初始時間為\(0\),到達其它點的最短時間。顯然可以先求出一天之內的,然后連邊,然后floyed做。
考慮從一個點\(S\)出發到其它點的距離,根據它的出發時間,可以把距離看成\(O(m)\)段。按照出發時間從大到小搞,之前有些不能走的邊可以走了,然后進行更新。總時間\(O(nm^2)\)。
其實也可以直接考慮一條邊\((u,v)\)的有效時間,設為\(tim\),把\(c_i\le tim\)的邊拉出來,反過來從\(u\)開始跑最短路,對於每個\(S\)得到\(dis_{tim}(S,u)\);然后再從\(v\)開始以\(tim\)時開始往后跑,處理出到每個點\(T\)的時間;於是就可以更新\((S,T)\),\(S\)的某個時間段出發,到達\(T\)的時間是多少。
詢問直接找到在哪個時間段即可,然后枚舉一天內能到達的點,再用一開始預處理的東西去查即可。
Day2T2
二分。轉化成切比雪夫距離,變成二維數點。
最后輸出具體方案的時候,直接用個固定長度的滑動窗口掃過去,維護另一維上點的分布。這樣就可以精准找到。
時間\(O(n\lg^2 n)\)。
Day3T1
考慮給第一個X標1,第一個X后面的所有Z標1,其它標0。遇到第一個1加入棧,后面遇到0加入棧,遇到1把棧清空到只剩下一個數。顯然這最優。於是就有了\(n\)的做法。
注意到如果有Z連續,那就把最后一個Z標1。假裝在第一個X后面加0,於是就得到一個長度為\(n+1\)的1不相鄰的串。
用點簡單生成函數算一下發現大概是\(F_{n+1}-F_n\)(\(F\)為斐波拉契數列)種方案,估計一下大概是\(2^{69400+}\)。
考慮壓縮起來。一種做法是強套平常的壓縮方式,即算出后面的方案數,按位確定,要寫高精度。
gmh77的做法:給序列分塊,每個塊分別用那種壓縮方式。發現塊大小取67的時候最合適。可以不用取高精度。
Day3T2
可以把人的移動抽象成\(t-x\)圖像。把每條線段延長,另外對於線段的端點,作條垂直於這條端點的直線。於是得到了個網格。
在網格點上DP,每次只需要從右上和右下轉移過。對於每個詢問,定位並找到網格上的最近點。
總時間\(O(n^2 +q\lg n)\)。
Day3T3
直接線段樹合並或啟發式合並或長鏈剖分之類的都可以做。
也可以點分治。點分治中子樹大小其實可以只記當前連通塊中的,分析下可以發現考慮算少的不會有影響。
當然我自己寫了個\(O(n^2\lg n)\)過了。
Day4T1
按位確定。現在相當於求一個區間內能搞多少個不相交的。發現選了一個之后一定是貪心選和它不交的右端點最小的,連邊,然后倍增處理。
Day4T2
先把每個九宮格划分成一個單位。一號位到七號位來標對應編號的目標在哪(以它為觀測點,把平面划分成13塊),九號位搞個特殊標記。這樣就可以得到做到\(14\)。
注意到一共只有7個目標,至少有兩個號位不會被占用。
於是稍微修改一下九宮格的划分,讓五號位一定不會被占用;對於另一個不會占用的號位,用八號位記一下是哪個。
這樣就能做到\(12\)。
Day4T3
寫出DP。發現dp中的值滿足單調性,於是可以很方便地用線段樹維護。
維護個線段樹滿足查詢最小值,區間加,區間賦值,線段樹合並,線段樹上二分即可。