原创 毒瘤之神祕通道

題目鏈接:毒瘤之神祕通道 因爲邊權和之前通過的人數有關,所以我們需要先一遍拓撲求出邊權。 然後第二次拓撲求出dp[i]以i爲起點到0的答案。 AC代碼: #pragma GCC optimize("-Ofast","-funr

原创 [BalticOI 2018]火星人的 DNA

題目鏈接:[BalticOI 2018]火星人的 DNA 顯然我們對每個限制取max即可。 然後每次維護當前有幾個滿足的。尺取即可。 AC代碼: #pragma GCC optimize("-Ofast","-funroll-

原创 Cow Jog G

題目鏈接:Cow Jog G 顯然我們只和第一個位置,和最後的位置有關。速度其實無所謂。 然後就變成一個一個序列的最少LIS劃分數,根據dirworth定理,也就是最長反鏈。 AC代碼: #pragma GCC optimiz

原创 數螃蟹

題目鏈接:數螃蟹 感覺大家的做法似乎都很複雜。 其實有一個簡單的做法,因爲只有3個數字不一樣,那麼我們隨機取兩個數字,取到合法的數字概率爲:(n-3)/n。 當n很大時,這個概率是很高的。 計算過程中會爆LL,所以我們用int1

原创 River Jumping

題目鏈接:River Jumping 顯然我們可以發現如果連續的3個之中,最後一個減去第一個都小於s則無解,否則我們可以貪心能跳就跳,因爲連續兩個之中小於s是不影響的,因爲我們特判了連續3個的情況。 然後我們最後反向掃一遍第一次

原创 跳舞的線 - 亂拐彎

題目鏈接:跳舞的線 - 亂拐彎 顯然到一個點之後,方向是有關係的,所以我們多加一個狀態存方向即可。 AC代碼: #pragma GCC optimize("-Ofast","-funroll-all-loops") #incl

原创 Codeforces - Reading Books (hard version)

題目鏈接:Codeforces - Reading Books (hard version) 我們可以發現如果我們選擇(1,1)的物品確定之後,那麼其他物品的選擇則變成了必然的。 然後可以枚舉選擇幾個(1,1)的物品,那麼複雜度

原创 線段樹:關於時間

題目鏈接:線段樹:關於時間 我們以一個基準點建立一個增加的線段樹,然後減去一個多餘的線段樹即可。 比如我們以1號爲基準點,那麼多餘的要減去的是已知的,就是到1號節點的距離,然後增加的也就是當前查詢的時候的編號。 AC代碼: #

原创 騷區間

題目鏈接:騷區間 顯然我們對每個左端點,可以ST表上二分,找到對應的合法右端點區間。 然後枚舉右端點,可以在ST表上二分,找到合法的左端點區間,我們把左端點區間排序一下,維護當前合法的左端點位置,然後fenwick上面查詢即可。

原创 Lotus Leaves

題目鏈接:Lotus Leaves 顯然是一個最小割模型。 但是我們暴力連邊是O(n ^ 3)的。考慮優化:我們可以把每一條豎着的,橫着的抽出來,然後就變成O(n ^ 2)了。沒什麼難度。 AC代碼: #pragma GCC

原创 Median Sum

題目鏈接:Median Sum 看到中位數,我們就會想到二分,但是子集太多了,二分也不行。 我們可以發現,中位數形成的集合,是對稱的。設s爲所有數的和,如果存在x那麼必然存在s-x。 所以我們只需要知道某個數字是否存在於某個集合

原创 Widespread

題目鏈接:Widespread 顯然有一個貪心,每次選擇最大的,然後減去A,其他的減去B。那麼就變成線段樹區間減,維護區間max的位置即可。 但是顯然可以二分,就不用寫線段樹了。先假設全用B,然後多出來的再用A。 AC代碼:

原创 Unplanned Queries

題目鏈接:Unplanned Queries 我們單獨看每一條鏈是很麻煩的,簡直無法做。 但是我們可以發現,如果某個葉子的次數爲奇數,那麼必然無解,然後刪掉葉子有出現新的葉子,顯然每個點的次數必然爲偶數。 AC代碼: #pra

原创 Codeforces - Sign on Fence

題目鏈接:Codeforces - Sign on Fence 顯然答案具有二分性。 但是如果我們對每個詢問單獨做,顯然TLE。但是所有答案的單調性的相同的,所以我們可以直接整體二分,然後線段樹維護區間最長連續1. AC代碼:

原创 01匹配

題目鏈接:01匹配 如果對於一個區間來說,我們肯定是貪心對0匹配之前最近的1. 然後我們可以發現兩個區間是可以簡單合併的。 直接線段樹即可。 AC代碼: #pragma GCC optimize("-Ofast","-funr