兩天炸掉了135分算法
指望得分:100+72+45函數
實際得分:100+21+31測試
T2有重邊,關於鄰接矩陣,它死了TAT,掛了記憶化搜索-39。 而後判c=0想到了1點沒度,然而我判的mp[1][x]==1,-12優化
T3單調點,可增可減,然而我只判了增,掛了。ui
說出題人毒瘤,不如說本身太naive。spa
有相同質因子的必定不能分開,隊列
質因數分解,並查集維護。it
2^20讓任何算法的複雜度沒法招架class
meet in the middle思想搜索
分紅兩部分,而後把狀態接起來看是否可行,指數除以2。
mp0/1[i][j]鄰接矩陣,[j]放bitset,緣由在後面。
設f[i][s][j]表示以i爲起點,路徑狀態s,j爲終點的路徑是否存在。[j]一維放bitset裏
固定一個i爲起點,枚舉狀態s,枚舉終點j,而後若是合法轉移點用mp0[j]填裝f[i][s<<1],1同理,這樣複雜度/32
設bitset<>g[s][i]表示狀態s在i開始,0/1表示不存在或存在。
而後2^20枚舉,合併,bitset直接&看是否可行。
記得在高位放1,區分010和0010
$x_{i-1}<x_i<x_{i+1} or x_{i-1}>x_i>x_{i+1}$能夠合併,這樣能夠將位移轉化爲左右橫跳。
任意間隔>l,那麼不能一次完成多個任務
化下式子發如今這種狀況下答案是一次函數,能夠O(1)
用鏈表維護位移,優先隊列維護最小間隔。
以上是口胡,尚未改過。
指望得分:100+50+20
實際得分:45+35+20
T1快讀沒開long long掛成暴力分qwq
T2考試結束前10分鐘發現部分分打炸(都不喜歡但廉價也能夠將就,霧),而後沒改完死了。
T3暴力打的很虛,稍優化還好
一眼線段樹
看到1e18值域,想了下序列,發現信息必須分段維護。因而肯定線段樹。
那只有離散化了,發現答案只可能在1,全部操做的l、r、r+1,把它們加到lsh[]裏,這樣就能在線段樹上保留它們的信息。
支持區間覆蓋,區間異或,區間最前0。
發現異或會將最前0和最前1交換,那麼維護f0[],f1[]表示區間[l,r]中最靠前的0/1
懶標記lz01[],lzxr[],維護對子區間的覆蓋,異或
注意:
區間異或 若是有lz01[]那麼把本區間的lz01[]取反,若是沒有把本區間的lzxr[]取反
保證覆蓋在前,xor在後的正確性
下下傳覆蓋標記要將子區間的lzxr[]清掉。
保證xor在前,覆蓋在後的正確性
down的時候先傳覆蓋,由於因爲以上操做兩個懶標記同時存在 必定是先覆蓋再xor的操做
部分分的啓示:當兩我的喜歡的物品集合不存在交集,那麼必定貪心選最小的裝滿k,而後再選剩下的最小的。
通常狀況,若是有交集,那麼優先考慮,由於加入一個會減小兩個,剩下的選擇多了,但交集部分的權值致使不單調。
因而咱們枚舉交集大小設爲r,必定會貪心地從小選。
只被一我的喜歡的部分都貪心選k-r個。
再線段樹維護下「剩下的物品」,支持insert,delete,前k小值和。查詢下m-p1-p2-i填滿m
每次增大r,把選的在線段樹中刪掉,只被一我的喜歡的物品,可知是彈出最大的,加到線段樹裏。
最後必定要注意特判、邊界。
神仙題:
對每一個點單獨考慮。
逆推出若是我要讓這個點存活那麼要犧牲的點的集合。
答案就是能逆推回去而且犧牲集合沒有交集的點對數。