Gym103371(XXII Open Cup. Grand Prix of Korea)


鏈接

A. Automatic Sprayer 2

只能膜拜孔姥爺,換我肯定找不全方程。

設每一行的和為 \(R_i\),每一列的和為 \(C_i\),那么有:

\[E_{x,y} = \sum_{i=1}^{n}|x-i|R_i+ \sum_{j=1}^{n} |y-j|C_j \]

考慮二次差分,會發現:

\[C_j=((E_{i,j+1}-E_{i,j})-(E_{i,j}-E_{i,j-1}))/2 \]

\(R_i\) 同理,那么我們只差 \(R_1,R_n,C_1,C_n\),沒有求出來。

然后再通過 \(E_{x,y}\) 的定義列方程:

\[R_1+C_1=(E_{n,n}-\sum_{x=2}^{n-1}(n-x)R_x-\sum_{y=2}^{n-1}(n-y)C_y)/(n-1) \]

可以繼續列出 \(R_1,C_n\)\(R_n,C_1\),然后發現第四個其實可以通過前三個推出來 (是否等價其實就看未知數,第四個方程的未知數完全可以用前三個組合出來,所以是線性相關的),所以我們還缺一個方程。然后加上很容易被忽略的 “行之和等於列之和” 即可搞出出新的未知數組合。

構造出行之和與列之和以后直接貪心即可。

for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) 
        	a[i][j]=min(r[i],c[j]),r[i]-=a[i][j],c[j]-=a[i][j];

只要行之和=列之和這樣的構造就是合法的,因為如果有在某一行填完的時候這一行的 \(r_i\) 還有剩余,那么說明前 \(i\) 行的和大於列總和,矛盾。

B. Cilantro

首先有一個很顯然的結論,如果對於一個入棧序列,一定能達成任何 0/1 個數與其相等的出棧序列。因為我們可以保證棧中只有 1 種元素,這樣未進棧的第一個和棧頂一定是兩種不同的元素。

第二個很顯然的結論:在滿足 \(S_i=T_1,S_j=T_1,i<j\) 時,若 \(j\) 可行,那么 \(i\) 一定可行,所以我們只要找到最右的可行點即可。

考慮第一個點的出棧點設其為 \(x\),在此時棧為空,所以相當於拆成了兩個子問題,其中要滿足 \(S_{2..x}\)\(T_{1..x-1}\) 0/1 個數相等。那么同理,第二個點就是在第一個出棧點的左邊再找一個滿足此類似條件的出棧點。容易發現,我們貪心讓出棧點靠右是正確的,所以雙指針掃一下就行了。

C. Equivalent Pipelines

兩個樹相同,當且僅當從大到小加邊(邊權相同的一起加),每次合並的點集都相同。

可以用哈希,每次合並的權值就是兩邊點集權值和的乘積再乘上邊權。每次合並權值都相等就行。

D. Flowerbed Redecoration

考慮置換。

把平移板子看成整個矩陣反着循環位移

\(\cal{F}\) 為旋轉 \(\{[1,d],[1,d]\}\) 的置換,\(\cal{G}\) 為整體向左平移的置換,\(\cal{H}\) 為整體向右平移的置換。那么行操作的置換就是 \(\cal A=(\cal F\circ\cal G)^i\circ\cal F\)。整體的置換就是 \((\cal A\circ\cal H)^i\circ\cal A\)

快速冪。

E. Goose Coins

先講一下我場上的 \(dp\)

考慮 \(p\) 的貪心分解:即記 \(a_i=(p \% c_{i+1})/c_i\),如果有解一定有 \(\sum a \leq k\)

\(f_{i,j}\) 表示搞出一個 \(c_i\)\(j\) 個硬幣的最大/最小代價,可以做一個背包,最壞復雜度為 \(O(k^3log_{1000}V)\)

然后直接用貪心分解再跑一個背包,復雜度 \(O(k^3)\),可以通過。

下面是 \(nk^2\) 的做法:

\(f_{i,j,k}\) 表示從后往前到 \(i\),填了 \(j\) 個,當前剩余 \(rest/c_i=k\) 。這樣是 \(nk^3\) 的,但是發現 \(i,j,k\)\(i,j-c_i/c_{i-1},k+1\) 往下貢獻的位置都是相同的,所以處理一個后綴 \(min/max\) 即可。

F. Hedgehog Graph

有點難,只講一下 \(2 \sqrt V + logV\) 的做法吧:對於所有 \(i \in [1,\sqrt V]\),詢問 \((s,i)\)\((s,\sqrt V i)\),發現任意一個 \([1,V]\) 的數都可以表示成兩個數之差,所以一定能找到相同點。

找到環長的倍數以后試除每個因子即可。

G. Lamb's Respite

拆成三段,即使初始血量不等於 \(H\) 也可以看成 \(H\) 然后加上一個 \(-x\)

直接維護區間的最小子段和,最小后綴和,最小后綴和是最后一個頂到 \(H\) 的位置,最小子段和是最容易觸底的地方。

如果不是鎖血的話,那么處理出最小子段和的終止節點,后面任意前綴和一定 \(>0\) ,只要考慮上界即可。

H. Or Machine

簽到題。對於每一個二進制位考慮,其實就是一個對於操作時間跑最短路。

J. Periodic Ruler

簽到題。首先把每一對的因子干掉,然后再對於 \(1 \sim n\) 把不同余數拍到一起看看是否必然有更小周期。

K. Three Competitions

孔姥爺的做法:

對於每個點求出它的直接出邊的度數。

很顯然這是一個競賽圖,對於競賽圖有一個性質就是可以通過出度得到 \(scc\)

具體地,對於度數排序,在縮點后的圖中后面點的出度一定大於前面的出度,所以 \(scc\) 一定是一個區間。

從后往前搞,去掉最后一個環必須要滿足剩下的點滿足總出度 = \(\frac{n(n-1)}{2}\)。從后往前掃一遍即可。

復雜度 \(O(nlog^2n)\)\(O(nlogn)\) ,取決於三維偏序的實現復雜度。

MYY 的做法:

有一種非常神仙的 \(scc\) 求法,即直接暴力 \(dfs\),然后記下出棧序列。

然后對於出棧序列從后往前掃,在反圖上再暴力 \(dfs\),找到的點就同屬於一個 \(scc\)

問題在於怎么找出邊,相當於分成 3 個圖,每個圖就是一個平面每次要找到一個在這個點左下的點。

對於第一維建立線段樹,維護在第一維 \([l,r]\) 區間中第二維的最小值,然后就可以刪了(為啥我只能想到樹套樹。。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM