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\)
構造出行之和與列之和以後直接貪心即可。
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\)
C. Equivalent Pipelines
兩個樹相同,當且僅當從大到小加邊(邊權相同的一起加),每次合併的點集都相同。
可以用雜湊,每次合併的權值就是兩邊點集權值和的乘積再乘上邊權。每次合併權值都相等就行。
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\) 把不同餘數拍到一起看看是否必然有更小週期。