【Codeforces】1137 Round #545 (Div. 1) C-F簡要題解

代碼能力還是太差


C.Museums Tour

明示拆點i(i,j)(0j<d)i\to (i,j)(0\leq j<d),縮點後拓撲排序dpdp

發現若存在(i,j)(i,j)(i,j)\to (i,j') ,則必然(i,j)(i,j)(i,j')\to (i,j)可達,大小爲dgcd(d,jj)\dfrac{d}{\gcd(d,j'-j)},所以ii所有的SCCSCC指向的後繼中必然不存在(i,k)(0k<d)(i,k)(0\leq k<d)。所以保證了每個點的貢獻只會被算11次。

考慮同一個SCC中的所有點,若存在一個簡單環使得gcd(d,len)\gcd(d,len)最小,設最小值爲gg,則若SCCSCC中存在(i,j)(i,j),那麼所有(i,j+kg)(i,j+k·g)都在這個SCCSCC中。

任意選SCCSCC中的一個點xx做根求生成樹,即得到所有簡單環的gg,預處理出0(g1)0-(g-1)時刻從xx出發能訪問的點數。

兩個SCCSCC之間的連邊g=gcd(gu,gv)g'=\gcd(g_u,g_v),保證邊數是O(md)O(m·d)的。

注意在實現過程中不需要真的拆點。

細節比較多,具體還是看yyb’s blog


D.Cooperative Game

好妙!

考慮如何用兩個點的移動找到tt

讓兩個點同時移動,點11每次移動,點22每兩次移動一格,直到兩點相遇。

具體分析這個過程:設當22移動tt格時,11t+pt+p格,那麼t%c=pt\% c=p,再走cpc-p11追上22
1,21,2位置均爲t+cpt+c-p。然後所有點一起向前移:其它點tt輪後到達位置tt1,21,2tt輪後到達t+cp+t%ctt+c-p+t\%c\equiv t

次數3t+2c2p3t+2c-2p


E.Train Car Selection

如果在前端插入,後面的點一定不會是最優點。

所以只有在幾輪沒有前段插入的修改後最優值可能爲後面的一些點,每個點的編號看做xx座標,常數項看做yy座標,則只需要維護一個下左凸殼,每次暴力彈棧頂(注意第一個點是(0,0)(0,0))。

可以結合下圖理解
在這裏插入圖片描述


F. Matches Are Not a Child’s Play

操作2,3是等價的。

對於一次xx的修改,設修改前優先級最大的點爲yy,發現燃燒次序的改變很有規律:
xyx\to y路徑上的點倒序構成序列的後半部分(yx)(y\to x),其餘點的相對次序不變構成前半部分。

於是把一次修改操作相當於把xyx\to y鏈染上新的一種顏色。
詢問點的次序相當於詢問顏色編號比它小的所有的鏈的總點數+同色點優先級比它小的點數。

把當前優先級最大的點作爲根,修改操作就可以用LCTLCTmakerootmakeroot維護了。
BIT維護每個顏色編號的點數,詢問相當於求顏色編號前綴和-當前點splay到根後左兒子大小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章