cometoj contest 6(记录型博客)
前言
由于時間過少,這里僅僅記錄我自己的思路(給自己看的),如果你有興趣可以看看原題,再看看我寫的,但是一般情況下不會很友好,此類文章在以后都會標記“(記錄型博客)”
A
我們發(fā)現(xiàn),所有的剩余量一定是
a+2ba+\sqrt 2 ba+2?b或者是C?(a+2b)C-(a+\sqrt 2 b)C?(a+2?b)的形式
把所有這些形式的全部抽出來
分析一下種類好像不是很多,然后建圖跑最短路即可
B
首先有個性質(zhì),就是這么生成的樹的直徑一定是小于等于O(logn)\mathcal O(logn)O(logn)的
然后考慮dp
設(shè)fu,lf_{u,l}fu,l?表示以uuu為根,直徑不超過ddd,距離uuu的最遠點距離不超過l的子樹最多包含的點數(shù)
轉(zhuǎn)移是對于每個fu,lf_{u,l}fu,l?,加入兒子,枚舉兒子更新到的lll,我們發(fā)現(xiàn)只需要l+s+1≤dl+s+1\le dl+s+1≤d即可,所以是一個前綴max形式,對于s+1>ls+1>ls+1>l的情況另外處理一遍即可
然后,在枚舉刪去點的數(shù)量的時候,我們只需要枚舉剩余直徑長度即可,所以要掃O(logn)\mathcal O(logn)O(logn)遍,每遍復雜度O(nlogn)\mathcal O(nlogn)O(nlogn)
綜上總復雜度O(nlog2n)\mathcal O(nlog^2n)O(nlog2n)
C
排序后直接統(tǒng)計相鄰兩個數(shù)相差大于m的數(shù)量即可
D
感覺是構(gòu)造題?
nnn是奇數(shù)的話
123???n?1nn12???n?2n?1n?1n1???n?3n?2??????????????????234???n1\begin{matrix} 1&2&3&···&n-1&n\\ n&1&2&···&n-2&n-1\\ n-1&n&1&···&n-3&n-2\\ ···&···&···&···&···&···\\ 2&3&4&···&n&1 \end{matrix} 1nn?1???2?21n???3?321???4?????????????????n?1n?2n?3???n?nn?1n?2???1?
就好了
然后若n=4n=4n=4
1234432121433412\begin{matrix} 1&2&3&4\\ 4&3&2&1\\ 2&1&4&3\\ 3&4&1&2\\ \end{matrix} 1423?2314?3241?4132?
之后就構(gòu)造了
設(shè)已經(jīng)求出答案為nnn的矩陣A(n)A(n)A(n)
沿著對角線翻轉(zhuǎn)的矩陣為A′(n)A'(n)A′(n)
現(xiàn)在要對新的nnn求答案,設(shè)n=2kn=2kn=2k
A(2k)={A(k)+kA′(k)A(k)%k+1A(k)+k}A(2k)=\left\{ \begin{matrix} A(k)+k&A'(k)\\ A(k)\%k+1&A(k)+k \end{matrix}\right\} A(2k)={A(k)+kA(k)%k+1?A′(k)A(k)+k?}
由于A(k)+kA(k)+kA(k)+k本身不會不滿足對稱的性質(zhì)
考慮A(k)%k+1A(k)\%k+1A(k)%k+1和A′(k)A'(k)A′(k),原本A(k)A(k)A(k)和A′(k)A'(k)A′(k)是完全對稱的,現(xiàn)在A(k)A(k)A(k)全部改了值,所以問題就解決了
E
建出所有免費走的地方之間的邊,跑最短路即可
復雜度O(n2log2n)\mathcal O(n^2log^2n)O(n2log2n)
F
按照權(quán)值從小到大加邊
新增點權(quán)為某個節(jié)點到當前點路徑的xor
然后建trie,加邊合并的時候啟發(fā)式在trie里查詢
總復雜度O(nlog2n)\mathcal O(nlog^2n)O(nlog2n)
G
如果沒有最后的交換操作的話直接貪心取段,然后將最多的段數(shù)與k比較即可
然后考慮有交換的情況,這就非常麻煩了
我們考慮[a1,a2][b1,b2][c1,c2][d1,d2][e1,e2][f1,f2]???[a_1,a_2][b_1,b_2][c_1,c_2][d_1,d_2][e_1,e_2][f_1,f_2]···[a1?,a2?][b1?,b2?][c1?,c2?][d1?,d2?][e1?,e2?][f1?,f2?]???的情況
假設(shè)我們要交換兩段,我們發(fā)現(xiàn)左段的左端點一定是某段的左端點,右段的右端點一定是某段的右端點(否則一定能分開新的段)
假設(shè)我們現(xiàn)在左段左端在x1x_1x1?,右段右端在y2y_2y2?
我們發(fā)現(xiàn)若x≠yx\neq yx?=y則交換之后一定不成立
所以x=yx=yx=y
于是我們相當于要把一段內(nèi)部花一次交換的代價以分成更多段
我們發(fā)現(xiàn)只要確定第一段和最后一段的端點,中間的當成不能交換的問題做就好了
我們要把第一段和最后一段翻轉(zhuǎn),所以第一段一定要包含R,最后一段一定要包含L,然后我們通過貪心把所有可以作為第一段的右端點的點都搞出來,我們發(fā)現(xiàn)這些點也可以成為最后一段的左端點,考慮這些分的段,如果除了第一段與最后一段剩下大于1段的,這兩段排序后將不有序,所以一定只有貪心出來的一段能繼續(xù)再分,于是我們就將每一段求出最大值取max即可
這里的段的示意圖[xk,n][xk?1,xk)???[x1,x2)[1,x1)[x_k,n][x_{k-1},x_k)···[x_1,x_2)[1,x_1)[xk?,n][xk?1?,xk?)???[x1?,x2?)[1,x1?),我們每次算一個[xi,xi+1][x_i,x_{i+1}][xi?,xi+1?]的答案就好了
,總復雜度O(n)\mathcal O(n)O(n)
下面是AC代碼
題目鏈接
H
我們發(fā)現(xiàn)只要贏的次數(shù)最多,直接貪心即可,兩行代碼足矣
I
大概是經(jīng)典的FFT題目,先轉(zhuǎn)化為原根求和,變成加法問題后直接用FFT做卷積即可
J
我們發(fā)現(xiàn),我們要求的是最長不上升子序列即0???01???10···01···10???01???1形式
要求所有的(sum0+sum1)sum0=sum02+sum1sum0(sum_0+sum_1)sum_0=sum_0^2+sum_1sum_0(sum0?+sum1?)sum0?=sum02?+sum1?sum0?
考慮枚舉最右邊的一個000
我們要求的是∑sum1\sum sum_1∑sum1?,并且要滿足這是最右邊的000,如果右邊有更多就不優(yōu)
考慮dp,fi,j,gi,jf_{i,j},g_{i,j}fi,j?,gi,j?分別表示到第i個數(shù),1的數(shù)量,方案數(shù)推完即可,復雜度O(n2)\mathcal O(n^2)O(n2)(容易發(fā)現(xiàn)111的數(shù)量要一直大于000的數(shù)量)
再考慮求左側(cè)的情況,要求∑sum0\sum sum_0∑sum0?非常方便,同理即可(不過這里容易發(fā)現(xiàn)000的數(shù)量要一直大于等于111的數(shù)量)
然后求∑sum02\sum sum_0^2∑sum02?好像也沒啥區(qū)別,貢獻的時候有個平方就好了
然后就做完了
復雜度O(n3)\mathcal O(n^3)O(n3)
K
容易發(fā)現(xiàn),對于原序列,每一個左括號都有相應(yīng)的有括號進行匹配,對于任何截取的一段l,rl,rl,r,括號匹配的要求是不變的,所以直接維護每個左括號匹配的右括號位置即可,每次詢問用一個區(qū)間max即可
)厲害的人可以搞一個O(n)?O(1)\mathcal O(n)-\mathcal O(1)O(n)?O(1)rmq
L
根據(jù)擴展歐幾里得可知x,y的通解
現(xiàn)在相當于求ax(b+x)+cy(d+y)ax(b+x)+cy(d+y)ax(b+x)+cy(d+y)
然后因為給出的系數(shù)都很小,好像枚舉就好了
結(jié)語
完
總結(jié)
以上是生活随笔為你收集整理的cometoj contest 6(记录型博客)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [51nod1847][算法马拉松23(
- 下一篇: 斯特林反演[bzoj4671]异或图