一句話題解1

Codeforces 768G The Winds of Winter

有一棵nn個點的有根樹,在刪掉一個點後得到一個森林,現在可以把某個點的父親換爲另一個點,使得節點數最大的子樹的大小最小。要求對每個點求刪掉該點後的答案。
n105n\le10^5

size[x]size[x]表示子樹大小,用主席樹維護一下每個點子樹中的sizesize和它到根路徑上的sizesize,每次一定是把刪掉該點後最大的樹的某棵子樹接到最小的樹上,於是直接在主席樹上查詢即可。
時間複雜度O(nlogn)O(n\log n)

hdu 6312 Game

有一個集合S={1,,n}S=\{1,\dots,n\},兩個人輪流操作,每次可以選走集合中的一個數和它的所有約數,問先手是否必勝。
T10,n500T\le10,n\le500

結論是先手必勝。若局面S={2,,n}S'=\{2,\dots,n\}是先手必勝,則先手可用同樣的方式獲勝,反之則先手第一步取11,同樣是先手必勝。
時間複雜度O(1)O(1)

luogu 2791 幼兒園籃球題

nn個球,其中有mm個藍球,nmn-m個紅球。現在從中選kk個球,選中xx個藍球的代價爲xLx^L,問期望代價。
T200,n,m2107,L2105T\le200,n,m\le2*10^7,L\le2*10^5

答案爲i=0k(mi)(nmki)iL\sum_{i=0}^k\binom{m}{i}\binom{n-m}{k-i}i^L
=i=0k(mi)(nmki)j=1i(ij)S(L,i)i!=\sum_{i=0}^k\binom{m}{i}\binom{n-m}{k-i}\sum_{j=1}^i\binom{i}{j}S(L,i)i!
=j=1kS(L,i)i!i=0k(mi)(ij)(nmki)=\sum_{j=1}^kS(L,i)i!\sum_{i=0}^k\binom{m}{i}\binom{i}{j}\binom{n-m}{k-i}
=j=1k(mj)S(L,i)i!i=0k(mjij)(nmki)=\sum_{j=1}^k\binom{m}{j}S(L,i)i!\sum_{i=0}^k\binom{m-j}{i-j}\binom{n-m}{k-i}
=j=1k(mj)(nk)S(L,i)i!=\sum_{j=1}^k\binom{m}{j}\binom{n}{k}S(L,i)i!
預處理斯特林數即可。

hdu 6314 Matrix

求有多少個nmn*m0101矩陣滿足至少有aabb列全是11
T5,n,m3000T\le 5,n,m\le3000

若只考慮行的情況,設容斥係數爲fif_i,則ans=i=an(ni)fi2nmimans=\sum_{i=a}^n\binom{n}{i}f_i2^{nm-im}
且可以得到j=ai(ij)fj=1\sum_{j=a}^i\binom{i}{j}f_j=1
可以O(n2)O(n^2)遞推出fif_i,列的容斥係數同理,然後對兩維分別容斥即可。

Codeforces 786E ALT

給定nn個節點的樹,有mm個點對(xi,yi)(x_i,y_i)。現在要給若干條邊和點對分配狗,對於個點對需要滿足要麼路徑有狗,要麼樹上xix_iyiy_i路徑上的每條邊都有狗,問最少需要多少條狗。
n20000,m10000n\le20000,m\le 10000

用樹剖線段樹優化建圖然後跑最小割即可。

Codeforces 1208G Polygons

在點數在33nn之間且擁有同一個外接圓的正多邊形中選出kk個,使得在經過任意旋轉後圓上的點數儘可能少。
n,k106n,k\le10^6

存在一種最優方案使得選出來的所有多邊形全都經過同一個點,否則可以通過旋轉使其滿足。顯然若選了點數爲xx的多邊形,則點數爲xx的約數的多邊形必然已被選擇,且此時新增加的點數爲φ(x)\varphi(x)。所以只要把33nn的歐拉函數排序後取前kk大就好了。

Codeforces 1217F Forced Online Queries Problem

nn個點,每次加入或刪除一條無向邊,或詢問兩點的連通性,強制在線。
n,m200000n,m\le200000

假的強制在線,因爲lastlast只有0011,所以每次把一條邊拆成兩條,欽定這兩條邊都要修改,然後做線段樹分治。每次處理完一個答案後,把本次詢問和下一次詢問之間不需要被加入的邊的對應標記翻轉即可。

LibreOJ 575 不等關係

給一個由>'>'<'<'組成的長度爲nn的字符串ss,統計有多少個長度爲n+1n+1的排列滿足pi<pi+1p_i<p_{i+1}當且僅當si=<s_i='<'
n100000n\le100000

如果不考慮>'>'的限制,那麼合法方案數等價於把11n+1n+1劃分成若干個上升序列的方案數。對>'>'的限制進行容斥,設fif_i表示前ii個位置中填入若干個上升序列的方案數除以i!i!cnticnt_i表示前ii個字符中有多少個>'>',則fi=j=0i1[sj=>]fj1(ij)!(1)cnti1cntjf_i=\sum_{j=0}^{i-1}[s_j='>']f_j\frac{1}{(i-j)!}(-1)^{cnt_{i-1}-cnt_j}
分治FFT即可。

Codeforces 1209E2 Rotate Columns

給出nnmm列的矩陣,可以對每一列進行任意次旋轉操作,設rir_i表示第ii行的最大數,要求最大化i=1nri\sum_{i=1}^nr_i
n12,m2000n\le12,m\le2000

問題可以轉化成可以對每一列進行任意次旋轉操作,並從每一行中選出一個元素,使得選出元素的和儘量大。不難發現只有最大值最大的前nn列是有用的。然後就可以狀壓dp,設fi,Sf_{i,S}表示前ii列且已在SS的行中選了數時的答案。
時間複雜度O(n3n+n22n)O(n3^n+n^22^n)

Codeforces 1209F Koala and Notebook

給一個nn個點mm條邊的無向圖,定義一條路徑的權值爲經過的每條邊的標號按順序連接起來組成的數字。求從11出發到每個點的最短路。
n,m105n,m\le10^5

跑最短路的時候,對每個點記錄到達該點路徑的最小權值在Trie上的對應位置,每次鬆弛的時候把邊上的數字加入Trie即可。

Codeforces 1215F Radio Stations

有一個nn個點的圖,每個點有一個對應區間,要求選出一個參數ff和若干個點,滿足如果一個點被選,則ff被其區間包含。且會給定若干條紅邊和藍邊,要求紅邊兩個端點至少有一個被選,藍邊兩個端點至少有一個沒被選,要求構造一組合法解。
n4105n\le4*10^5

如果沒有ff的限制,顯然這是個2-sat問題。加入限制後,可以對ff的每個取值cc拆成兩個點,分別表示ff不大於ccff大於cc,於是又變回了2-sat問題。

Codeforces 1192B Dynamic Diameter

給一棵樹,邊有邊權,要求支持修改邊權和詢問直徑,強制在線。
n100000n\le100000

算是比較經典的題了吧,樹剖,LCT,點分樹都能做。有一種比較巧妙的做法,就是先求出這棵樹的全dfs序,也就是每次到達一個點就將其加入序列末端,最後得到一個長度爲2n12n-1的序列aa。設點xx到根的距離爲disxdis_x,在序列中第一次出現位置爲posxpos_x,則x,yx,y的距離爲disx+disyminposxkposy2disakdis_x+dis_y-\min_{pos_x\le k\le pos_y}2*dis_{a_k}
也就是說樹的直徑就是maxxyz(disax+disaz2disay)\max_{x\le y\le z}(dis_{a_x}+dis_{a_z}-2*dis_{a_y})
修改邊權就相當於區間加,用線段樹維護對應信息即可。

Codeforces 1221E Game With String

有一個長度爲nn0101序列,先手每次可以將連續aa00變成11,後手可以將連續bb00變成11,不能操作者輸,問先手是否必勝。
n3105,a>bn\le3*10^5,a>b

注意到a>ba>b,那麼如果當前存在一段長度在[b,a1][b,a-1]之間的00,顯然後手必勝,故只需要判斷先手第一步操作後後手能否取得這樣一個局面即可。

Codeforces 1221G Graph And Numbers

有一個nn個點mm條邊的無向圖,每個點的權值可以取0011,每條邊的權值爲兩端點的權值和,問有多少種方案滿足權值爲0,1,20,1,2的邊均至少存在一條。
n40n\le40

容斥一下,發現比較難求的就只有不能出現權值爲22的邊的情況。用meet in the middle,然後預處理可行的情況並處理出高維前綴和,就可以統計答案了。

Codeforces 1076G Array Game

有一個數組a1,,aka_1,\dots,a_k,當前指針位於a1a_1並讓a1a_111,兩個人輪流操作,設當前位置爲xx,每次可以選擇一個y[x,max(x+m,k)]y\in [x,max(x+m,k)]且滿足ay>0a_y>0,把指針移到yy處並把aya_y減去11。不能操作者輸。有一個數組,要求維護區間加,並詢問對一個區間進行遊戲時先手是否必勝。
n200000n\le200000

注意到遊戲結果只跟元素的奇偶性有關。考慮倒着染色,先把儘量長的偶數段染爲顏色11,再把接下來的m+1m+1個元素染成顏色22,不斷重複操作。那麼先手獲勝當且僅當a1a_1的顏色爲22。用線段樹維護矩陣並支持區間翻轉即可。

Codeforces 1229D Wojtek and Card Tricks

nn11kk的置換,對於每個區間[l,r][l,r]求通過區間內的置換可以得到多少個不同的置換。
n200000,k5n\le200000,k\le 5

把每個置換看成一個點,預處理出置換間的轉移。枚舉右端點,那麼就只用考慮所有第一次出現的置換。維護當前能得到的置換集合,若某個新加入的置換還沒被得到,就暴力更新答案。注意到一個置換羣的子羣大小必然是他的約數,所以每次加入新置換後得到的置換集合大小至少增大一倍,所以總的時間複雜度爲O((k!)2+nk!k)O((k!)^2+nk!k)

LibreOJ 6270 數據結構板子題

給出nn個區間,每次詢問有多少個區間被給定區間包含且長度不小於kk
n,q500000n,q\le500000

可以發現在所有區間長度在kk和詢問區間長度之間時,答案就等於總區間數減去有一個端點不在詢問區間內的區間數。考慮用差分來統計,然後把區間按長度從小到大插入,用樹狀數組維護即可。

AcWing 109 天才ACM

定義一個序列的價值爲在序列中選出最多mm對數,每個數只能被選一次,每對數的差的平方和的最大值。給一個長度爲nn的序列,問最少能將序列分成幾段,使得每一段的價值均不超過RR
n,m500000n,m\le500000

顯然用二分或正常的倍增求右端點或會超時。這題的做法是先從小到大倍增,再從大到小倍增,具體來說就是跳的步數爲20,21,...2^0,2^1,...。若跳到2k2^k步時不能繼續跳,則嘗試着跳2k1,...,21,202^{k-1},...,2^1,2^0步。每次跳的時候,先將新加入的數排序,然後與之前已經加入的數歸併排序,不難證明這樣做的時間複雜度爲O(nlogn)O(n\log n)

Codeforces 1251F Red-White Fence

給兩個長度分別爲n,kn,k的數組a,ba,b,現在要從aa中選出任意個數,bb中選出恰好一個數組成序列a1,,ak,b,ak+1,ama'_1,\cdots,a'_k,b',a'_{k+1},\cdots a'_m,滿足a1<<ak<b>ak+1>>ama'_1<\cdots<a'_k<b'>a'_{k+1}>\cdots>a'_m每次詢問給出QiQ_i,問有多少個合法的序列滿足2(b+m+1)=Qi2(b'+m+1)=Q_i
n,ai,bi3105,k5n,a_i,b_i\le 3*10^5,k\le 5

枚舉bb中選哪個數,如果一個數在aa中出現一次,則OGFOGF1+2x1+2x,出現次數大於11OGFOGF1+2x+x2=(x+1)21+2x+x^2=(x+1)^2,用二項式定理求出每個同類項的係數,然後FFT一下就好。

Codeforces gym102268D Dates

nn個女孩和tt天,第ii天可以約會aia_i個女孩,每個女孩可以約會的時間爲[li,ri][l_i,r_i],問最多可以約會多少個女孩。
n,t300000n,t\le 300000

考慮按左端點從小到大的順序貪心,顯然最優的方案是每次選取儘量靠左的位置放,若不能放,則考慮替換掉前面權值儘可能小的一個,且替換掉該元素之後,位於該元素後面的元素的位置都會往前移。用一個隊列維護可以被當前位置替換的元素,顯然每個元素能往前移的步數是有限制的,用線段樹維護隊列中每個元素還能往前移多少步即可。

Codeforces 1253F Cheap Robot

給一個nn個點mm條邊的無向圖,邊有邊權,其中前kk個點爲關鍵點。有qq次詢問,每次詢問會給出兩個關鍵點,求一個最小的閾值cc,滿足從一個關鍵點走到另一個關鍵點的路徑長度不能超過cc的條件下這兩個關鍵點連通。
n105,m3105n\le10^5,m\le3*10^5

如果把關鍵點之間的邊權看作最短路,那麼只要求出關鍵點之間的最小生成樹即可。先跑最短路求出與每個點距離最近的關鍵點是誰,然後枚舉每條邊,強制這條邊一定要被經過,從而得到一條新邊。對構成的新圖求最小生成樹即可。

Codeforces 1254E Send Tree to Charlie

給一棵nn個節點的樹,把所有邊按照某種順序排列後,依次交換每條邊兩端節點上的數,從而得到一種方案。現在固定一些節點上的數,問有多少種可能方案。
n500000n\le500000

和CSP的d1t3長得很像。先考慮全部位置都是00的情況,採用增量法,每加入一個葉節點uu,則它造成的影響只取決於新邊在使用vv的哪條出邊後被使用,相當於把答案乘上degv\deg_v。因此最終答案就是degi!\prod deg_i!.
對於某些位置固定的限制,設經過的路徑爲t1,,tst_1,\cdots,t_s,則帶來的限制爲(t1,t2)(t_1,t_2)必然是t1t_1的所有出邊中第一個被使用的;對於tit_i,使用(ti1,ti)(t_{i-1},t_i)後下一個使用的一定是(ti,ti+1)(t_i,t_{i+1})(ts1,ts)(t_{s-1},t_s)一定是tst_s的所有出邊中最後一個被使用的。注意到所有路徑的長度和一定不會超過2n22n-2,因此每次交換會使這個值增加22
於是可以對每個點分別計算,設在這個點上的限制會構成kk條鏈,那麼答案就乘以k!k!.

Codeforces 1264D2 Beautiful Bracket Sequence

定義一個合法括號序的深度爲,(a)(a)的深度是aa的深度+1+1abab的深度是a,ba,b深度的較大值,其中a,ba,b均爲合法括號序。一個括號序的深度爲去掉任意個字符後得到的合法括號序深度的最大值。
給出一個括號序,其中有若干個位置可以任意填,求所有方案的深度之和。
n106n\le10^6

小清新計數題。對於一個括號序,若它深度爲dd,則一定能通過刪除操作將其變成dd個左括號加dd個右括號的形式。也就是說每個位置左邊左括號數量(即爲lil_i)和右邊右括號數量(記爲rir_i)的較大值(記爲wiw_i)的最大值即爲括號序的深度。
又可以發現一個括號序中恰有一個位置滿足li=ri=wi=dl_i=r_i=w_i=d,則只需要在這樣的位置進行計數。
枚舉每個位置,然後考慮這個位置的貢獻。係數爲左括號數量,可以看成每個左括號的貢獻是11.
對該位置左邊的每個左括號,以及強制把??變成左括號統計貢獻,用組合數計算合法方案數即可。

Codeforces 1285F Classcal?

給出長度爲nn的數組aa,求max1i<jnlcm(ai,aj)\max\limits_{1\le i<j\le n}lcm(a_i,a_j).
n,ai105n,a_i\le 10^5

考慮枚舉gcdgcd,問題變爲對一個集合SS,求滿足x,yS,gcd(x,y)=1x,y\in S,gcd(x,y)=1的所有數對(x,y)(x,y)xyxy的最大值。
從大到小枚舉集合中的元素,維護一個棧。對於當前元素,若存在一個非棧頂元素與它互質,則不停退棧。而棧中與元素xx互質的元素個數等於dxμ(d)s(d)\sum_{d|x}\mu(d)s(d)

其中s(d)s(d)表示棧中有多少個元素是dd的倍數。只需在入棧出棧的同時維護ss即可。
時間複雜度O(σ2(i))O(\sum\sigma^2(i)).

Atcoder Dwango Programming Contest 6th E - Span Covering

題目鏈接

nn個長度給定的左閉右開區間放置在[0,X)[0,X)中,端點必須是整數,問有多少种放置方式使得[0,X)[0,X)中的每個點都至少被一個區間覆蓋。
n100,X500n\le 100,X\le 500

考慮按長度從大到小放置區間,並把交集非空的區間合併,得到一系列不相交的區間,設長度分別爲L1,,LkL_1,\cdots,L_k且滿足L1LkL_1\ge\cdots\ge L_k,則新加入一個長度爲ll的區間時有以下幾種情況:
1、得到一個長度爲ll的新區間。
2、與某一個區間合併。不妨設與第ii個區間合併,若不增加區間長度,則有Lil+1L_i-l+1種方案,否則對於任意1x<l1\le x<l,有22種方案使得區間增加長度xx
3、合併兩個區間。不妨合併區間i,ji,j,則對於任意0x<l0\le x<l,有lx1l-x-1種方案使得合併後的區間長度爲Li+Lj+xL_i+L_j+x.
不難發現dp的時候只需要維護kkLi\sum L_i即可完成轉移,時間複雜度爲O(nX2)O(nX^2).

Codeforces 1288F Red-Blue Graph

一個左邊有n1n_1個點,右邊有n2n_2個點的二分圖,每條邊可以被染成紅色或藍色,花費分別爲r,br,b,也可以不染色。每個點要麼沒有限制,要麼與它相連的紅邊數量要嚴格大於藍邊數量(紅點),要麼藍邊數量要嚴格大於紅邊數量(藍點)。問最小花費是多少。
n1,n2,m,r,b200n_1,n_2,m,r,b\le 200

考慮網絡流。令每條雙向邊的流量爲11,若從左邊流到右邊表示染成紅色,右邊流到左邊表示染成藍色,否則不染色。對於左邊的紅點,必須滿足入流大於出流,從ss向其連一條下界爲11無上界的邊,藍點和無色點類似。然後通過把一條邊拆成兩條轉成費用流即可。

Codeforces 1295F Good Contest

給出nn個區間,在每個區間內等概率選一個數,問最終得到的序列單調不升的概率。
n50n\le 50

離散化後設fi,j,kf_{i,j,k}表示前ii個區間,在第jj個值域區間內有kk個數的概率,用前綴和優化轉移即可。

洛谷P6061 [加油武漢]疫情調查

給一個nn個點mm條邊的有向圖,要求用若干個環覆蓋所有點。一個環的代價爲經過的邊權值之和,若一個點沒有被覆蓋,則要付出aia_i的代價。問最小代價。
n500,m5000n\le 500,m\le 5000

由於一個點可以被多個環覆蓋,先做傳遞閉包,然後把自己連向自己的邊權設爲aia_i,用km跑最小權匹配就好。

洛谷P6060 [加油武漢]傳染病研究

D(x)D(x)表示xx的約束個數,給出n,kn,k,求i=1nD(ik)\sum_{i=1}^nD(i^k)
T104,n,k107T\le 10^4,n,k\le 10^7

ii的質因數分解爲p1a1pmamp_1^{a_1}\cdots p_m^{a^m},則D(ik)=(1+ka1)(1+kam)D(i^k)=(1+ka_1)*\cdots*(1+ka_m)。若把kk看作未知數,則展開後得到一個關於kk的多項式,且次數不超過88。於是線性篩求出每個數對應的多項式,然後對係數求前綴和,就可以O(1)O(1)詢問了。

洛谷P6156 簡單題

給出n,kn,k,求i=1nj=1n(i+j)kf(gcd(i+j))gcd(i+j)\sum_{i=1}^n\sum_{j=1}^n(i+j)^kf(\gcd(i+j))\gcd(i+j)
f(k)f(k)定義爲:若kk有平方因子則f(k)=0f(k)=0,否則f(k)=1f(k)=1
n5106,k1018n\le 5*10^6,k\le 10^{18}

推一波式子求出來答案是x=1nxk(i=1nxj=1nx(i+j)k)dxdμ2(d)μ(xd)\sum_{x=1}^nx^k(\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{x}\rfloor}(i+j)^k)\sum_{d|x}d\mu^2(d)\mu(\frac{x}{d})

iki^k和後面的迪利克雷卷積都可以用線性篩來求,時間複雜度O(n)O(n)

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