1. 程式人生 > 其它 >一些題(一)

一些題(一)

一些題(一)

[CERC2014] The Imp

一個觀察,對於已經確定的寶箱集合,按照 \(b_i\) 升序依次選一定是最優的,證明可以考慮調整。所以按 \(b_i\) 降序排列進行 dp 即可。

https://www.luogu.com.cn/record/59632899

[ICPC2019 WF] Traffic Blights

\(m_i=r_i+g_i\),考慮依次計算每個字首攔下車的概率。

一個簡單的想法是列舉到 \(\operatorname{lcm}m_i\) 進行計算。然後發現對於互質的一些部分,由於中國剩餘定理,可以分別計算然後合併;對於 \(m_i\mid m_j\), 可以把 \(i\)

併到 \(j\) 上一起計算。那麼困難的部分就是既不互質也不整除的情況。

考慮 \(M=2^3\times3^2\times5\times7=2520\),將所有時間按 \(\bmod M\) 分組考慮,這樣新的週期就變為了 \(m'_i=m_i/\gcd(m_i,M)\)。發現此時 \(m'_i\) 要麼互質要麼整除,方便計算,總複雜度為 \(O(Mn\max m_i)\)

https://www.luogu.com.cn/record/59639555

[ICPC2014 WF] Maze Reduction

一個亂搞做法,隨 \(30\) 次,每次隨一個足夠長的序列表示每走一步後順時針轉多少次,記錄下以每個點作為起點,依次經過房間的度數。然後用 hash 判一下兩個點每次走出來的度數序列是否相同就好了。需要注意的是一開始的方向不確定,所以要從每個路口都開始一邊然後找最小表示之類的來判迴圈同構。

https://www.luogu.com.cn/record/59719485

[CERC2015] Looping Labyrinth

從原點出發,有三種情況:走不到任何其它矩形的左上角,只能走到一條直線上所有矩形的左上角,或能走到平面上所有矩形的左上角。考慮從原點開始 bfs \(2\times10^6\) 步,邊能區分出以上三種情況並預處理出一些合法的點。

回答詢問時,考慮找到原點可達的,理詢問點最近的矩形左上角。第一、三種情況平凡,第二種情況可以在那條直線上三分。

https://www.luogu.com.cn/record/59808015

[ICPC2016 WF] Spin Doctor

\((a_i,b_i)\)

畫在平面上,將 \(c_i=1\) 的點染成黑色。那麼問題轉化為找到一個斜率 \(k\),用兩條斜率為 \(k\) 的直線分別從上下夾住所有黑點,使得被同時夾住的白點數最小。

考慮建出黑點的凸包,那麼在凸包裡的白點一定會貢獻答案。對於在凸包外的白點,找到它切凸包的兩條切線,那麼當 \(k\) 在這兩條切線斜率之間時會給答案貢獻 \(1\)。於是轉化後的問題可以用掃描線解決。

CF1599G Shortest path

當起始點不在那條線上時容易特判,否則,最多不經過一個直線上兩相鄰點的間隙,列舉它然後分類討論就行。

https://codeforces.com/contest/1599/submission/131535388

AGC031E Snuke the Phantom Thief

列舉最終偷了 \(k\) 個珠寶,那麼橫座標的約束可以給某些第 \(i\) 小的橫座標一個限制,縱座標同理。於是建出圖來跑費用流就好了。

AGC035D Add and Remove

容易想到區間 dp,但是發現左右端點的貢獻不一樣,所以考慮將它們計入狀態。設 \(f_{l,r,x,y}\) 表示刪完區間 \((l,r)\)\(l\) 將要貢獻 \(x\) 次,\(r\) 將要貢獻 \(y\) 次的最小代價。轉移時列舉最後一個被刪的數,得 \(f_{l,r,x,y}=\min_{l<i<r}\{f_{l,i,x,x+y}+f_{i,r,x+y,y}+(x+y)a_i\}\),答案為 \(f_{1,n,1,1}+a_1+a_n\)

經過妙妙分析,狀態數是 \(O(2^n)\) 的,複雜度為 \(O(n2^n)\)

https://atcoder.jp/contests/agc035/submissions/26554782

AGC032E Modulo Pairing

發現一定有一種最優方案使得將這些數從小到大排序後所有配對不交,否則可以調整。

有兩種配對方式,一種兩數之和和 \(<M\),一種 \(\geq M\)。那麼可以找到一個 \(x\),使得 \(\leq x\) 的數用第一種方式配對,剩下的用第二種。並且在合法的情況下 \(x\) 越小越好,於是 \(x\) 可以二分。

https://atcoder.jp/contests/agc032/submissions/24239011

AGC037E Reversing and Concatenating

首先答案的開頭一定是 \(S\) 中的最小字母,然後發現每次操作可以將開頭最小連續段長度翻倍,於是至多隻用操作 \(O(\log n)\) 次。每次操作時暴力選字典序最小的串(非最後一次操作時選其反串)即可,複雜度為 \(O(n^2\log n)\)

https://atcoder.jp/contests/agc037/submissions/26605782