AtCoder Regular Contest 106
最近一直被ZCK推坑,vir了好幾場ARC
然後打完AGC才發現自己rating太低unrated,爛死XD
結果打完這場還是不到能夠rated的標準1200 QQ
然後想說寫一下題解好了 :P
A. 106
Statement
給你N,問你有沒有正整數A,B使得3A+5B=N,N≤1018
Solution
因為A,B最多都是log量級的所以亂枚舉就好了
基本上也不太會溢位
AC CODE
B. Values
Statement
給你一張無向圖,還有每個點一開始寫的數字ai
每次可以把兩個相鄰的點x,y一個數字+1一個數字-1
問你是否能讓最後第i個點寫的數字是bi
1≤N≤2×105
0≤M≤2×105
−109≤ai,bi≤109
Solution
只要一個連通塊裡ai的總和和bi的總和相同就做的到
於是用 dsu 維護總和
AC CODE
C. Solutions
一開始想說這題題敘很長先跑去做 pD
結果是水題,不過還是WA慘QQ
Statement
「給你N個線段,請選出最多條兩兩完全不相交的線段。。」
現在有兩種演算法A,B分別嘗試解決上述問題:
- A演算法:按照右界由小到大排序,並按照順序考慮線段。如果現在考慮的線段不會和當前的解的任何一條相交,則將其加入當前的解中。輸出最後的解的大小
- B演算法:按照左界由小到大排序,並按照順序考慮線段。如果現在考慮的線段不會和當前的解的任何一條相交,則將其加入當前的解中。輸出最後的解的大小
請構造一組輸出使得「A輸出的答案 - B輸出的答案 = M」
注意你構造的線段端點必須是不大於109的正整數,而且全部相異
1≤N≤105
−N≤M≤N
Solution
因為A演算法會是這個問題的最佳解,所以M<0是無解
首先B演算法一定至少會拿一個線段,所以M=N一定無解
M=N−1的話表示有一個拿所有線段的解,也就是所有線段都不相交,B會和A有同樣的輸出,也是無解
對於0≤M<N−1的case,先構造N−1條完全不相交的線段,接著考慮把剩下來的那條當作左界最小的,讓他和後面N−1個線段中的前M+1條相交,於是A,B演算法的輸出將會相差M
我在賽中一開始沒注意到N=1的case,特判N=1,M=0才AC QQ
AC CODE
D. Powers
Statement
給你長度N的序列A=(A1,A2,…,AN)以及K
對於所有1≤X≤K
請輸出(i=1∑N−1j=i+1∑N(Ai+Aj)X)(mod998244353)
Solution
煩躁推式子
我不擅長QQ花好久
首先i=1∑N−1j=i+1∑N(Ai+Aj)x=21(i=1∑Nj=1∑N(Ai+Aj)X−i=1∑N(2Ai)X),先把i<j的條件拔掉
然後發現
i=1∑Nj=1∑N(Ai+Aj)X=i=1∑Nj=1∑Np=0∑X(pX)AipAjX−p=p=0∑X(pX)(i=1∑NAip)(i=1∑NAiX−p)
對於0≤p≤K預處理i=1∑NAip就能K2算出來了,總時間複雜度是O(NK+K2)
AC CODE
後面都是賽後才寫出來的題目QQ我就爛
E. Medals
我覺得這題真的很有趣,沒寫出來好可惜
Statement
有N個員工,以今天為基準,第i個員工會先工作Ai天,接著放假Ai天,又工作Ai天、放假Ai天,周而復始。
每天會頒發一個獎牌給有來工作的其中一個員工。當然如果當天沒有員工來工作就不會頒發任何獎牌。
現在想請問你,在最佳的情況下,最少要多少天,才能讓所有員工都得到至少K面獎牌?
1≤N≤18
1≤K≤105
1≤Ai≤105
Solution
最近才vir到一場需要Hall’s theorem的題目XD馬上就用到
我的解是考慮對答案二分搜
對於一個固定的天數D,想像一張有D+NK個頂點的二分圖,兩部份分別代表每一天以及每個人的K個獎牌,並且如果該天可以頒給那個人獎牌就連一條邊,那麼我們想要知道的就是是否有一個大小NK的匹配。
假設A是NK個頂點中的一個subset,Γ(A)是其鄰居,包含一些代表天數的頂點
那麼,根據Hall’s theorem,有那樣的完美匹配若且唯若∀A,∣A∣≤∣Γ(A)∣
不失一般性只需要枚舉2N種組合,因為代表同一個人的頂點選再多個都不會影響鄰居的集合
接下來就是我因為不熟而沒在賽中寫完的部份QQ
為了對於所有subset都確認不等式的條件,我們必須知道有多少天會影響到這個subset的點
注意答案最多是2K∑Ai,因此可以預處理每天可以對應到的鄰居
假設Cnts代表在D天內有多少天對應到s這個subset,以及Days代表有多少天會影響到s這個subset
那麼
Days=t&s=0∑Cntt
用SOS DP或是被稱為Fast Zeta Transform的技巧可以在O(N2N)的時間複雜度內計算。
總時間複雜度是O((C+N2N)logC),其中C=2K∑Ai。聽說C可以壓到O(NK)不過我不太會OAO
AC CODE
Statement
有一個玩具有N個零件,還有N−1個連接部件
第i個零件上面有di個孔
每個孔只能和一個連接部件連接,每個連接部件可以透過孔連接兩個零件
問你有多少不同的連接方式把所有零件組裝在一起。
注意零件上面的孔是相異的,但是所有連接部件都是相同的。
也就是說,兩種連接方式T1,T2相同,若且唯若所有在T1中的連接部件e1,在T2中都有對應的e2,兩端的零件編號以及孔編號完全相同。
Solution
我們將會介紹一種方法計算完全圖的生成樹有幾種,並且仿照該方式計算此問題的答案。
- 假設N個點的完全圖有X個生成樹。對於某個生成樹,可以任意定一個點當作根,並且把N−1個邊加上編號,這樣的方式總共有X×N×(N−1)!種。
- 用另一種觀點來看邊有標號的有根樹數量。每一步我們加上一條有向邊,考慮加邊加到現在的生成森林,這一步加上去的有向邊的起點可以是任何一個點,但是終點必須是某個連通塊的根,而且不能是同一個連通塊。也就是說,在第i輪有N×(N−i)種選擇,因為除了自己以外的連通塊有N−i個。於是總方法數是i=1∏N−1N(N−i)=NN−1(N−1)!
- X×N×(N−1)!=NN−1(N−1)!⇒X=NN−2
同樣地,我們先假設本題的答案是X,並且令S=∑di
- 考慮某種連接零件的方式,並且把N−1個邊加上編號,這樣的方式總共有X×(N−1)!種。
- 首先,先在每個零件選擇一個特殊孔,大致上是負責當作那個點和他的父節點連接的孔。在前N−2步,我們每次加上一條邊,其中一個端點可以是任何還沒用過的孔,但是不能是特殊孔;而另一個點必須是某個連通塊的根的特殊孔。這樣在第i輪有(S−N−i+1)⋅(N−i)種方法。最後一步,剩下兩個連通塊,我們把他們的特殊孔連在一起。這樣有∏di⋅i=1∏N−2(S−N−i+1)(N−i)種方法。
- 故 X=∏dii=0∏N−3(S−N−i)
這題是我跑去找別人的解QQ
我看了好多解,好像都有用到Cayley定理甚至生成函數之類的QAQ好噁心
找了好久最後看到官方youtube的講解才聽懂
AC CODE
總結
這次有點可惜沒做出E QQ
然後看別人blog的時候驚訝他怎麼那麼厲害orz
希望某次有機會破台ARC