最近在刷省選題......大體上是按照省份刷的。
不過上面的題目順序是按照寫題的順序排列的,因此可能會有點亂哈。node
最小圓覆蓋,隨機增量法,指望複雜度\(O(n)\)。es6
\(\mbox{Kruskal}\)重構樹+二維數點。算法
求\(\sum_{i=1}^n\sum_{j=1}^i\frac ij-\sum_{i=1}^n\sum_{j=1}^i\lfloor\frac ij\rfloor\)。
前半部分隨便弄弄就行了。
後半部分,\(\sum_{j=1}^i\lfloor\frac ij\rfloor\)實質上等於\(\sum_{j=1}^id(j)\)。
因此前綴和一下就行了。數組
求\(\frac{\prod_{i=1}^ni^{\sum_{j=1}^i\lfloor\frac ij\rfloor}}{\prod_{i=1}^n\prod_{j=1}^ij^{\lfloor\frac ij\rfloor}}\)。
上半部分就是\(\sum_{i=1}^ni^{\sum_{j=1}^id(j)}\)。
下半部分,\(\prod_{j=1}^ij^{\lfloor\frac ij\rfloor}\)實質上是\(i\)的各約數的乘積,也就是\(i^{\frac{d(i)}2}\)。
因此前綴積一下就行了。函數
辛普森積分,雖然是假的。優化
多項式求\(\ln+\mbox{MTT}\)。誰說莫比烏斯反演的來着?spa
丟貓錕題解就跑code
很顯然是要求\(\prod_{i=1}^n\frac{1-x^i}{1-x}\)的\(x^m\)次項係數。
一種作法是求\(\ln\)以後大力開式子,而後能夠\(O(n\ln n)\)調和級數求得一多項式而後再\(\exp\)回去。
還有一種作法是拆成先後兩部分,\((\frac1{1-x})^n=(\sum_{i=0}^{\infty}x^i)^n\),至關於\(n\)個盒子每一個盒子能夠無限放球的生成函數,因此\(x^m\)次項係數是\(\binom{n+m-1}{m}\)。\(\prod_{i=1}^n(1-x^i)\)能夠看作一個帶符號的\(01\)揹包計數,其中第\(i\)個物品的重量剛好爲\(i\)。考慮到至多選\(O(\sqrt m)\)個物品,因此能夠作\(O(n\sqrt m)\)的\(dp\)。blog
設\(f_{i,j}\)表示前\(i\)對情侶已經入座,有\(j\)對情侶是挨着的的方案數。考慮插入第\(i+1\)對情侶。
\(f_{i,j}\)能夠轉移到\(f_{i+1,j-2},f_{i+1,j-1},f_{i+1,j},f_{i+1,j+1}\),分別表示第\(i+1\)對情侶分別拆散了兩對情侶、只拆散了一對情侶、沒有拆散情侶以及他倆坐在一塊兒。注意兩人分開座時可能會致使某對情侶複合,轉移的時候要額外算一下貢獻。排序
線段樹合併模板題。樹上差分的時候,對\(lca\)與\(fa_{lca}\)打標記而不是作線段樹單點插入,便可把空間減少到一半。
座標離散,橫座標從左往右掃,維護每一個縱座標已存在的點數,組合數算一下,再用樹狀數組區間求和便可。
矩陣快速冪模板題。
枚舉\(n\)維中每一維座標的極差\(\Delta x_i\),有
\[\sum_{\Delta x_1=1}^{m_1}\sum_{\Delta x_2=1}^{m_2}...\sum_{\Delta x_n=1}^{m_n}\binom{\gcd(\Delta x_1,\Delta x_2...\Delta x_n)-1}{c-2}\prod_{i=1}^n(m_i-\Delta x_i)\]
枚舉\(\gcd(\Delta x_1,\Delta x_2...\Delta x_n)\),有
\[\sum_{d=1}^{\min(m)}\binom{d-1}{c-2}\sum_{\Delta x_1=1}^{m_1/d}\sum_{\Delta x_2=1}^{m_2/d}...\sum_{\Delta x_n=1}^{m_n/d}[\gcd(\Delta x_1,\Delta x_2...\Delta x_n)=1]\prod_{i=1}^n(m_i-\Delta x_id)\]
反個演
\[\sum_{d=1}^{\min(m)}\binom{d-1}{c-2}\sum_{t=1}^{\min(m)/d}\mu(t)\sum_{\Delta x_1=1}^{m_1/dt}\sum_{\Delta x_2=1}^{m_2/dt}...\sum_{\Delta x_n=1}^{m_n/dt}\prod_{i=1}^n(m_i-\Delta x_idt)\]
換個寫法
\[\sum_{d=1}^{\min(m)}\binom{d-1}{c-2}\sum_{t=1}^{\min(m)/d}\mu(t)\prod_{i=1}^n\sum_{\Delta x_i=1}^{m_i/dt}(m_i-\Delta x_idt)\]
令\(T=dt\),改變枚舉順序
\[\sum_{T=1}^{\min(m)}(\prod_{i=1}^n\sum_{\Delta x_i=1}^{m_i/T}(m_i-\Delta x_iT))\sum_{d|T}\binom{d-1}{c-2}\mu(\frac Td)\]
令\(F(T)=\prod_{i=1}^n\sum_{\Delta x_i=1}^{m_i/T}(m_i-\Delta x_iT)\),\(G(T)=\sum_{d|T}\binom{d-1}{c-2}\mu(\frac Td)\)。
首先\(G(T)\)在給定\(c\)的前提下能夠\(O(n\ln n)\)預處理出來。
觀察\(F(T)\),將其劃開
\[F(T)=\prod_{i=1}^nm_i\lfloor\frac{m_i}T\rfloor-\frac{T\lfloor\frac{m_i}T\rfloor(\lfloor\frac{m_i}T\rfloor+1)}2\]
若是\(\lfloor\frac{m_i}T\rfloor\)肯定的話,那麼\(F(T)\)就是一個關於\(T\)的\(n+1\)次多項式。因此能夠預處理\(G(T)T^i\)的前綴和,而後對於每一個\(\lfloor\frac{m_i}T\rfloor\)相同的連續段暴力求\(F(T)\)。
整體複雜度\(O(n\ln nc+nmc+Tn^3\sqrt m)\)有點爆炸啊。
直接爆搜質因子,特判最後一個大於根號的質因子便可。
對於前面的相同元素,直接強制從最後一個這種元素轉移便可。
先枚舉跳躍高度和連跳次數,而後直接記搜轉移便可。
正難則反,求三點共線的方案數。枚舉相隔較遠的兩點的橫縱座標之差,而後第三個點就有\(\gcd-1\)種選法。注意特殊處理橫縱座標差爲\(0\)。
設\(f_n\)表示\(n\)點二叉樹的數量,\(g_n\)表示\(f_n\)棵二叉樹的總葉子節點個數。
最近作初賽題發現\(f_n\)就是卡特蘭數。
\(g_n\)是啥?考慮\(f_n\)中的一棵\(n\)點二叉樹,設其有\(m\)個葉子,那麼刪掉這\(m\)個葉子後就能獲得\(m\)棵不一樣的\(n-1\)點二叉樹;而每棵\(n-1\)點二叉樹有\(n\)個位置能夠掛葉子,也就是說在上述過程當中被計算了\(n\)次。因此\(g_n=nf_{n-1}\)。
\(ans=\frac{g_n}{f_n}=\frac{nf_{n-1}}{f_n}=\frac{n(n+1)}{4n-2}\)。
樹剖+線段樹兩隻\(\log\),用\(\mbox{LCT}\)寫能夠作到一個\(\log\)。
每一個點維護區間最大值,最小值,後面最大值減前面最小值的最大值,前面最大值減後面最小值的最大值。
其實棋子是放在中間那一行的。
因此直接按行\(dp\)就好了。處理一下相鄰兩行的兩個狀態是否能夠轉移,由於轉移都是同樣的因此能夠矩乘優化,複雜度\(O(2^{3m}\log n)\)
聽說這玩意兒叫精確覆蓋?直接狀壓完事了。
由於保證\(a\)能夠由一個排列獲得,因此\(x\)就必定會是排列,不然不更優。貪心,儘可能把數值大的放在前面,把數值小的放在後面。對於\(a_i\)值相差爲\(1\)的點對創建拓撲關係,而後依次填數,最後統計一遍答案就好了。
正解是動態開點線段樹,可是感受比較難寫,就換了一種寫法。
開個\(\mbox{std::set}\)維護未放置的區間,平衡樹維護已放置的位置集合,支持插入刪除,找前驅後繼,統計區間點數便可。(若是迭代器支持相減的話就能夠直接開兩個\(\mbox{std::set}\)作了)
其實只要可以獲得最終生成的序列就很好辦了。考慮從大到小肯定每一個數在最終序列裏的位置,至關於查找當前的第\(k\)大元素。\(BIT\)可作。
對於全部要出去的小矮人,必定是按照\(a+b\)權值從小到大出去最優。
排序,而後設\(f_i\)表示出去了\(i\)個小矮人時人梯的最高高度。若是\(f_j+b_i\ge h\)就能夠用\(f_j-a_i\)更新\(f_{j+1}\)。
黑白染色而後跑最小割。
一條鏈是考過的原題。
若是是樹的話一樣能夠設\(f_{u,i}\)表示\(u\)點子樹內,\(u\)點排在第\(i\)個的方案數,每次轉移就是合併兩個序列,枚舉\(f_{u,i}\)以及在\(u\)的前面放\(j\)個元素,根據大小限制決定是從\(f_{v,1...j}\)轉移過來仍是從\(f_{v,j+1...sz_v}\)轉移過來,一樣能夠用前綴和優化轉移,同時要乘上先後隔板插入的方案數\(\binom{i+j-1}{j}\times\binom{sz_u-i+sz_v-j}{sz_v-j}\),複雜度\(O(n^2)\)。
上一題弱化版。雙倍經驗。
預處理多重揹包的先後綴\(dp\),每組詢問\(O(m)\)回答。
\(f_u\)表示\(u\)點子樹內最少要選多少個葉子才能必勝,若是\(u\)點是本身控制的那麼\(f_u=\min\{f_v\}\),不然\(f_u=\sum f_v\)。找出全部多是最優轉移點的葉子便可。
找到最高和最低的非零係數\(a_m,a_n\),由於答案是有理數因此必定是\(\frac pq\)的形式,更具體的\(p\)必定是\(a_m\)的約數\(q\)必定是\(a_n\)的約數。因此暴力枚舉一下而後\(\mbox{check}\)。\(\mbox{check}\)的話,\(x\)是浮點數很差作,能夠選幾個大質數作模意義下的運算判斷結果是否是\(0\)便可。
維護三個矩陣\(A,B,C\)分別表示走不超過\(x\)步任意兩點之間的路徑條數、路徑長度和、路徑長度平方和,還要維護一下走剛好\(x\)步兩點間的路徑條數。倍增轉移大力討論一波便可。
先問兩次肯定首位,剩下三種字符,假設爲\(012\),設當前已知串爲\(S\),那麼詢問\(S0S10S11S12\)便可一次得知下一位是什麼。末位還須要問兩次,共計\(n+2\)次。
再增強版之後再寫吧。
首先把\(m=1\)的狀況特判掉。
\[S_k=\sum_{i=1}^ni^km^i\\mS_k=\sum_{i=1}^ni^km^{i+1}=\sum_{i=2}^{n+1}(i-1)^km_i\\(m-1)S_k=\sum_{i=2}^{n+1}(i-1)^km_i-\sum_{i=1}^ni^km^i\\=n^km^{n+1}+\sum_{i=1}^n((i-1)^k-i^k)m^i\\=n^km^{n+1}+\sum_{i=1}^n(\sum_{j=0}^{k-1}\binom kj(-1)^{k-j}i^j)m^i\\=n^km^{n+1}+\sum_{j=0}^{k-1}(-1)^{k-j}\binom kjS_j\]
\(O(n^2)\)遞推便可。
題意理解題。至關因而給你一棵樹要你給節點標號,要求兒子標號不得大於父親,同時要最小化(每一個點標號-其父親標號)。直接按照子樹大小訪問兒子便可。
直接搜索就過了。
先枚舉\(minh\)再枚舉\(minv\),第二層的枚舉顯然是單調的,可是由於每一個人都有\(minh\)和\(minv\)的限制,因此考慮用兩種不一樣的順序加入和刪除,保證在刪除一個位置的時候它已經被加入過了。
\(Floyed\)求出任意兩數之差的取值範圍,而後\(O(n^2)\)枚舉點對算就好了。
最後插入的點必定是斜堆左側鏈中沒有右兒子的最淺點,若是這個最淺點只有一個葉子左兒子的話就還多是這個葉子左兒子。\(O(n^2)\)模擬便可。
枚舉起點,求出到達每一個點最少須要通過的障礙數量,取不超過\(T\)的便可。
至關於\(K\)個單調隊列,每次彈出\(K\)箇中的最小值,答案就是每一個隊首放在一塊兒的極差。
對每塊單獨考慮。由於每一個位置只能塗一次顏色,因此能夠設\(f_{i,j}\)表示前\(i\)個位置塗了\(j\)次的最大收益,從\(f_{k,j-1}\)轉移過來。而後再對全部塊放在一塊兒作個揹包就行了。
每一個點新建\(8\)個入點用來表示不一樣的距離,而後直接矩乘。
一條路徑圍住了一粒豆豆當且僅當從這顆豆豆出發向外引一條射線,與路徑相交奇數次。枚舉起點,設\(f_{x,y,s}\)表示目前在\((x,y)\)這個點,已經圍住了\(s\)集合的豆豆的最小路徑長度,即\(s\)這個集合內的豆豆引出的射線與路徑相交了奇數次。能夠假設每條射線都是向右上以一個極小的斜率發射出的,這樣就能夠方便地處理出每走一步\(s\)的變化。更新一圈回到原點後計算答案便可。
設\(f_{i,j}\)表示第\(i\)天手持\(j\)股的最大收益,\(g_{i,j}\)表示對\(i\)做前綴和。顯然\(f_{i}\)從\(g_{\max(0,i-w-1)}\)轉移過來,轉移的過程分買入和賣出兩種討論,顯然能夠用單調隊列優化。
三分套三分。\(\mbox{yyb}\)說卡精可是我一遍過了呀?
搜出全部合法數字,去掉是別的數的倍數的數字(由於容斥的時候直接抵消了),而後大力容斥。還能夠降序排這些數使\(lcm\)儘快增加到很大從而剪枝。(這什麼鬼題)
\(\binom{n+m}{m}-\binom{n+m}{m-1}\)
線段樹。附核心代碼
struct node{ int len,s0,s1,l0,r0,l1,r1,v0,v1,t0,t1,tt; void init(){len=s0=s1=l0=r0=l1=r1=v0=v1=t0=t1=tt=0;} void set0(){s0=l0=r0=v0=len;t0=1;s1=l1=r1=v1=t1=tt=0;} void set1(){s1=l1=r1=v1=len;t1=1;s0=l0=r0=v0=t0=tt=0;} void rev(){swap(s0,s1);swap(l0,l1);swap(r0,r1);swap(v0,v1);swap(t0,t1);tt^=1;} }t[400005]; node operator + (node a,node b){ node c;c.t0=c.t1=c.tt=0; c.len=a.len+b.len;c.s0=a.s0+b.s0;c.s1=a.s1+b.s1; c.l0=a.s0==a.len?a.len+b.l0:a.l0;c.r0=b.s0==b.len?b.len+a.r0:b.r0; c.l1=a.s1==a.len?a.len+b.l1:a.l1;c.r1=b.s1==b.len?b.len+a.r1:b.r1; c.v0=max(max(a.v0,b.v0),a.r0+b.l0);c.v1=max(max(a.v1,b.v1),a.r1+b.l1); return c; }
每一個點匹配一條邊,若是是一棵樹的話就是標號最大的那個點沒有匹配。
\(\mbox{spfa}\)的作法是假的。考慮先把全部帶等號的關係連上邊(\(\ge,\le,=\)),而後\(\mbox{Tarjan}\)縮點求出須要相等的點集,再連上\(>,<\)的邊跑拓撲\(dp\)便可。
插頭\(dp\)。用\(0/1/2\)狀態表示沒有插頭/有一個未拐彎的插頭/有一個已拐彎的插頭。轉移看上去要分\(3\times3=9\)種狀況,但實際上\(12,21,22\)都是不合法的,因此就只剩六種了。
數位\(dp\)。把\(K\neq0\)與\(K=0\)的分開作,\(K\neq0\)那\(K\)必定只含\(2,3,5,7\)這四種因子,在\(10^{18}\)內只有幾萬個,因此先預處理一下\(f_{i,j},g_{i,j}\)表示\(i\)位數各位數字乘積是\(j\)的方案數以及這些數之和,每組詢問的複雜度大概就是\(O(18\times9)\)的。\(K=0\)反過來求乘積不爲\(0\)的隨便搞搞就行了。
第一問\(bfs\)。第二問最小樹形圖。不過這是一個分層圖(按高度分層),因此直接把邊按照較低點高度爲第一關鍵字,邊權爲第二關鍵字排序而後\(\mbox{Kruskal}\)便可。
貌似有不少種奇奇怪怪的複雜度正確或是不正確的作法。
這裏寫的是\(\mbox{SA+BIT}\),就是拿全部串放在一塊兒求一個\(SA\),而後每一個詢問串就是後綴數組上的一個區間,至關因而求區間內有多少種顏色以及每種顏色被多少個區間覆蓋。均可以用樹狀數組維護,前一個是經典問題,後一個就對每一個位置考慮有多少個區間覆蓋了本身而沒有覆蓋本身的前驅便可。
先手寫一遍\(\mbox{kmp}\),而後只要把\(\mbox{kmp}\)倒着作一遍就行了。
先手寫一遍\(\mbox{manacher}\),而後只要把\(\mbox{manacher}\)倒着作一遍就行了。
一個\(n\)位數的第\(i\)位的貢獻是\(i\times\sum_{j=i}^nB^{j-i}\),因而就能夠把貢獻拆開分別計算。大力討論,寫起來很複雜。
建最大生成樹,題目中給的那\(q\)個點就預先用\(\inf\)邊連起來。而後求出樹上路徑最小值後模擬最大流直接貪心便可。注意中途運算過程可能會爆\(\mbox{int}\)。
平衡樹隨便搞搞。
離線,每次詢問至關因而求路徑上加入時間在\(T-c-1\)及之前的點的個數。鏈剖+\(BIT\)。
設\(f_{i,j}\)表示從\(i\)點出發,遍歷完\(i\)的子樹後走到\(i\)深度爲\(j\)的祖先的最小代價。
\(g_{i,j}\)表示從\(i\)點出發,遍歷完\(i\)的子樹後走到\(i\)深度爲\(j\)的祖先的兄弟的最小代價。
轉移比較簡單,判一下\(i\)沒有兒子或是隻有左兒子,不然就是先走左兒子和先走右兒子取\(\min\)。
以後枚舉起點,暴力向上跳計算答案,複雜度\(O(n\log n)\)。
聽說數據很水......寫了一個\(O(q\sqrt m\log n)\)的作法,就是把全部邊重定向後保證每一個點度數不超過\(O(\sqrt m)\),而後修改直接暴枚出邊,對每一個點維護\(3\)個\(\mbox{multiset}\),即三種顏色的點指向當前點的全部邊,再在全局維護\(9\)個\(\mbox{multiset}\),討論一下便可。
如下是正解。考慮一棵樹的作法,直接套用上面那個方法能夠作到\(O(q\log n)\),由於每一個點都只有一條出邊。而原題的性質實質上是說原圖能夠被劃分紅爲不超過三個森林,因此把上述算法作三次就好了。
首先斐波那契數列有一個性質\(\gcd(f_n,f_m)=f_{\gcd(n,m)}\),證實這裏就不證了。
考慮最值反演\(\max_s=\sum_{t\subseteq s,t\neq\varnothing}(-1)^{|t|+1}\min_t\),把它放到每一個質因子的指數上去,因而答案就是\(\prod_{t\subseteq s,t\neq\varnothing}f_{\gcd_t}^{(-1)^{|t|+1}}\)。
枚舉\(\gcd\),式子變爲\(\prod_{d=1}^nf_d^{\sum_{t\subseteq s,t\neq\varnothing}(-1)^{|t|+1}[\gcd_t=d]}\)。
\(\prod_{d=1}^nf_d^{\sum_{d|i}\mu(\frac id)\sum_{t\subseteq s,t\neq\varnothing}(-1)^{|t|+1}[i|\gcd_t]}\)
\(\prod_{i=1}^n(\prod_{d|i}f_d^{\mu(\frac id)})^{\sum_{t\subseteq s,t\neq\varnothing}(-1)^{|t|+1}[i|\gcd_t]}\)
\(\sum_{t\subseteq s,t\neq\varnothing}(-1)^{|t|+1}[i|\gcd_t]\)當且僅當存在一個數是\(i\)的倍數時爲\(1\),不然爲\(0\)。
而\(\prod_{d|i}f_d^{\mu(\frac id)}\),若是你令\(f_d=\prod_{i|d}g_i\),那麼\(g_d=\prod_{i|d}f_i^{\mu(\frac di)}\)。
因此求出\(g_d\)以後就直接作吧。
和上一題同樣的,遞推式\(f_i=2f_{i-1}+f_{i-2}\),一樣知足斐波那契數列的性質。
考場上寫了\(40pts\)單調隊列,答案是\(\min_{i=1}^n\{\max_{j=i}^{i+n-1}\{T_j-j\}+i+n-1\}\)。
首先內層的\(j\)能夠直接循環到\(2n\),因此內層其實是一個後綴最大值,而每一個後綴最大值貢獻答案的位置必定是在下標最小的那個位置。線段樹維護單調棧便可。
設\(f_{n,m}=\sum_{i=0}^m\binom ni\),根據\(\mbox{Lucas}\)定理有
\(\sum_{i=0}^m\binom ni=\sum_{i=0}^{p-1}\binom{n/p}{0}\times\binom{n\%p}{i}+\sum_{i=0}^{p-1}\binom{n/p}{1}\times\binom{n\%p}{i}+...+\sum_{i=0}^{m\%p}\binom{n/p}{m/p}\times\binom{n\%p}{i}\\=f_{n/p,m/p-1}\times f_{n\%p,p-1}+f_{n\%p,m\%p}\times\binom{n/p}{m/p}\)
預處理一下而後搞搞。
二分便可。
設\(f_i\)表示\(i\)點子樹所有激活,\(i\)點先於父親被激活的最小代價,\(g_i\)表示\(i\)點晚於父親被激活的最小代價。比較顯然的一點是\(0\le f_i-g_i \le c_i\)。
若\(c_i\le1\)則至多兩種狀況,若\(f_i=g_i\)則選\(f_i\),不然選\(g_i\),能夠證實不存在更優。複雜度\(O(n)\)。
若\(c_i>1\)則能夠揹包作一下,複雜度\(O(n^2c)\)。
考慮一個含加減號的序列,將加減所有取反,運算結果除開頭的一段連乘外所有抵消。
因此答案就是\(\sum_{i=1}^{n-1}(\prod_{j=1}^ia_j)\times2\times3^{n-i-2}+\prod_{i=1}^na_i\)。
線段樹隨便維護一下便可。
建個序列自動機預處理\(g_{i,j}\)表示從\(i\)位置開始第一個\(j\)字符的出現位置。
\(f_s\)表示\(s\)這個集合內的\(|s|!\)種排列的最晚出現位置,xjb轉移一下,複雜度\(O(n2^n)\)。
聽說\(n>21\)必定不合法。。。而後就作完了吧。
掃描線,每次查詢當前已有半徑的\(\mbox{kth}\),能夠用樹狀數組反正我寫的線段樹。
記\(f_i\)表示\(i\)這我的目前發了多少條微博,\(g_i\)表示\(i\)這我的的答案。鏈接一條邊時\(g_u-=f_v,g_v-=f_u\),斷開時\(g_u+=f_v,g_v+=f_u\),最後再把全部沒斷開的邊斷開便可。
一開始還覺得有什麼組合意義上的高論......直接\(O((2n)^3\log m)\)矩乘便可。
維護\(\mbox{kth}\),仍是樹狀數組可作(怎麼\(\mbox{SHOI2013}\)考兩道同樣的題啊)
就是個傻逼狀壓\(dp\),先搜出全部穩定狀態,而後枚舉每一個狀態轉移,\(f_{i,j,k}\)表示前\(i\)個物品,倉庫裏是\(j\),地面上狀態是\(k\)的最優解,複雜度大概是\(O(m\times6^8)\)的。
轉一下座標軸,再把橫座標除以\(p\),就變成了最小圓覆蓋的板子。指望複雜度\(O(n)\)。
是否是幾年前沒有線段樹分治這種科技啊......爲何要加這麼多奇怪的限制條件啊......