某些看了但不想寫代碼的題


最新版會在這里更新。


HDU.5977.Garden of Eden(點分治)

\(Description\)
給定一棵\(n\)個點的樹,每個點有一個顏色,顏色一共有\(k\)種。求有多少條路徑包含\(k\)種顏色。
\(n\leq 10^5,\quad k\leq 10\)

\(Solution\)
點分治。狀壓顏色。記\(cnt[s]\)表示狀態為\(s\)的路徑個數。
如果當前點狀態為\(s\),那么就可以從\(s\)的補集以及\(s\)的補集的超集更新Ans。
但是這樣復雜度當然爆炸。所以直接令\(cnt[s]\)表示狀態為\(s\)\(s\)的超集的路徑數。
每次合並一棵子樹的狀態時,枚舉子樹的狀態\(s_i\),然后對於\(s_i\)的所有子集\(s'\)\(cnt[s']\)++。
代碼見:https://www.cnblogs.com/WABoss/p/6036216.html。
還有用FWT做的社會人:https://www.cnblogs.com/Menhera/p/9514412.html, http://www.cnblogs.com/sclbgw7/p/9508235.html。


hihoCoder.1496.尋找最大值(高維前綴和)

\(Description\)
給定\(n\)個數\(a_i\),你需要找到兩個數\(a_i,a_j\),使得\(a_i*a_j*(a_i\&a_j)\)最大。輸出這個最大值。
\(n\leq 10^5,\quad 0\leq a_i<2^{20}\)

\(Solution\)
考慮枚舉\(t=a_i\&a_j\)。那我們要對每個\(t\)求,滿足\(a_i\&a_j=t\)\(a_i,a_j\)中,乘積最大的一對。
但是還是不好求啊。這個條件其實可以削弱,即我們對每個\(t\),求\(t\)\(a_i\&a_j\)的子集,乘積最大的一對\(a_i,a_j\)。顯然不會丟失最優解。
\(t\)\(a_i\&a_j\)的子集,即\(t\)同時為\(a_i,a_j\)的子集。那么枚舉\(t\)的超集,求最大的兩個數做\(a_i,a_j\)就可以了。
可以用高維前綴和求,也可以對每個\(a_i\)直接枚舉子集。是復雜度有差別吧?前者是\(O(2^kk)\),后者是\(O(n\log a_i)\)


北京八十中集訓 12.20 例一.Triple(思路 計數)

\(Description\)

\(Solution\)
需要\(O(n^2)\)解決。可以令\(Two[v]\)表示\(a_j+a_k=v,\ i-D<j\leq k<i\)的二元組\((j,k)\)的個數,\(One[v]\)表示\(a_j=v,\ i-D<j<i\)\(j\)的個數,那么\(Ans_i=\sum_jOne[a_i-a_j]+Two[a_i-2a_j]+[3a_j=a_i]\)
顯然會有重復。每個\(One\)會被計算三次,所以給后兩項帶一個權值,讓每個\(Triple\)恰好被計算三次,就可以直接去重了。


北京八十中集訓 12.20 例二.Manhattan(CDQ分治)

\(Description\)

\(Solution\)


Codeforces.150E.Freezing with Style(點分治 二分答案 單調隊列)

\(Description\)

\(Solution\)
二分答案\(mid\),然后點分治(當然點分治過程中二分答案更好些)。
對於以每個點為根的子樹,求是否存在邊數\(len\)\([L,R]\)之間且至少存在\(\frac{len}{2}\)條邊權\(\geq mid\)的路徑。
把邊權\(\geq mid\)的邊的權值設為\(1\)\(<mid\)的設為\(-1\),對於每種邊數只需維護權值最大的路徑即可。顯然可以單調隊列維護。但注意要先將子樹按最大深度從小到大排序以保證復雜度。
復雜度\(O(n\log^2n)\)


HDU.5381.The sum of gcd(線段樹/莫隊 RMQ)

\(Description\)
給定長為\(n\)的序列\(a_i\)\(q\)次詢問,每次給定\(l,r\),求\(\sum_{i=l}^r\sum_{j=i}^r\gcd(a_i,a_{i+1},...,a_j)\)
\(n,q\leq10^4,\ a_i\leq10^9\)

\(Solution\)
莫隊 RMQ:
把要求和的區間畫出來。每次移動區間左右端點的時候,觀察改變的會有什么。
假如原先區間是\([4,6]\),現在左端點移動到\(3\),當前答案會加上 \(3,3\;\;3,4\;\;3,5\;\;3,6\)\(\gcd\)。也就是固定\(l\),往右求\(\gcd\)一直到\(r\)
因為固定一個左端點\(l\)\(a[l...n]\)這個后綴中的\(\gcd\)只有\(\log\)種,所以可以枚舉\(g=\gcd\),假設\(g\)出現在區間\([l,\ r']\),然后跳到\(r'\)那里去,再從\(r'\)跳到下一個\(\gcd\)的位置,直到到達\(r\)為止。
這個過程中可以累加答案,復雜度是\(\log\)
從每個位置開始的第幾個\(\gcd\)出現在哪,還要RMQ+二分預處理一下。總復雜度\(O(n\log^2n+n\sqrt{n}\log n)\)
當然能想起Magic GCD這道題,預處理可以用單調棧,雖然復雜度還是\(n\log^2n\)的但顯然常數小許多。
線段樹:
同樣把要求和的區間畫出來,就很明顯了。
比如設當前區間為\([3,6]\)(左端點為\(3\)右端點為\(6\)),要求的區間有:
\(3,3\;\;3,4\;\;3,5\;\;3,6\\\;\;\;\;\;\;\;4,4\;\;4,5\;\;4,6\\\;\;\;\;\;\;\;\;\;\;\;\ \ \ \,5,5\;\;5,6\\\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\ \ \ \ \ 6,6\\\)
以列為下標(上面分別是\(3,4,5,6\)),當詢問左端點\(l=3\),右端點為\(r\)時,答案就是區間\([3,r]\)的和。
而每次向左移動\(l\),會在上面增加一行。而以\(a[l...n]\)\(\gcd\)只有\(\log\)種,可以暴力算出這\(\log\)\(\gcd\)以及它們對應出現的區間(還是同Magic GCD這道題),然后就可以直接區間加。
所以就是,把詢問離線,按左端點從右往左處理。
復雜度\(O(n\log^2n)\)


Codeforces.17E.Palisection(Manacher/回文樹)

\(Description\)
給定一個字符串\(s\)。求\(s\)有多少對回文子串,滿足這兩對回文子串在\(s\)中的位置有交集。
\(|s|\leq2\times10^6\)

\(Solution\)
記回文子串總數為\(sum\),那\(Ans=C_{sum}^2-\text{沒有交集的回文子串對數}\)
而沒有交集的回文子串對數,就是\(\sum_{i=1}^{n-1}\text{以i結尾的回文串數}*\text{i后邊的回文串數}\)
\(i\)結尾的回文串數\(cnt_i\)可以直接回文樹,或是Manacher+差分求。\(i\)后邊的回文串數就是\(\sum_{j=i+1}^ncnt'_j\)。把串反過來求一遍\(cnt_i\)的后綴和就可以了。
因為\(|s|\)\(2e6\),回文樹要用邊表存轉移。


牛客練習賽38 E.出題人的數組(貪心)

\(Description\)
給定兩個長為\(n,m\)的序列\(A_i,B_i\)。你需要把兩個序列拼成長\(n+m\)的序列\(C_i\),要求原本同在\(A_i\)\(B_i\)序列中的數在\(C_i\)中的相對順序不變。求最小的\(\sum\limits_{i=1}^{n+m}i*C_i\)
\(n,m\leq10^5\)

\(Solution\)
先把整個\(A\)序列放在\(B\)前面。然后我們每次要找\(B\)的一個前綴扔到\(A\)里面去,且位置不能超過上一次放的那個前綴的位置。
假設選的\(B\)的前綴長度為\(x\),和為\(s_1\),放的位置離\(A\)的末尾距離為\(y\),這一段和為\(s_2\)
那么當\(y*s_1>x*s_2\)時,這么做會優。移一下項就是\(B\)這段前綴的平均值更大。
而選的這段\(B\)的前綴應該是平均值盡量大的。
同時\(C\)序列最后是一段\(A\)+一段\(B\)+一段\(A\)+一段\(B\)...要讓這些段的平均值遞減。
所以我們就先把\(A,B\)分成一些平均值遞減的段,最后按平均值大小歸並就可以了。。


牛客OI周賽7 提高組.C.小睿睿的方案(線段樹)

\(Description\)
給定一棵樹及\(m\)條路徑。求有多少條路徑滿足不完全包含這\(m\)條路徑中的任意一條。
\(n,m\leq10^5\)

\(Solution\)
考慮求不合法的路徑數。發現這些路徑都是一個點在一段DFS序連續的區間中,另一個點在另一段DFS序連續的區間中。掃描線+矩陣求交即可。
復雜度\(O(n\log n)\)


CF.464E.The Classic Problem(可持久化線段樹 Hash)

\(Description\)
給定一張\(n\)個點\(m\)條邊的無向圖,邊權都是形如\(2^{x_i}\)的形式(\(0\leq x_i\leq 10^5\))。給定\(s,t\),求\(s\)\(t\)的最短路。
\(n,m\leq10^5\)

\(Solution\)
考慮如何改進\(Dijkstra\)使得能做這道題。我們把\(dis\)數組用線段樹存成\(2^{a_1}+2^{a_2}...\)的形式。
判斷\(dis\)時,可以像字符串\(Hash\)一樣,從高到低位在線段樹上二分,找到第一個不同的位置,判斷上面的大小關系。\(Hash\)可以直接用題目給的\(seed=2,\ mod=10^9+7\),當然最好還是自己再寫個。
每次枚舉一條邊修改\(dis\)時,一個暴力的想法是,每次只改一位,就可持久化一下,在對應位置\(+1\),如果產生進位就暴力再在下一個位置\(+1\)
這樣復雜度是不對的,可以卡成\(O(nm\log w)\)(然而網上都是這種辦法...出題人竟然數據造水了,ssfd)。
官方題解的做法是,初始建兩棵全\(0\)和全\(1\)的線段樹,進位時可以直接替換節點,這樣復雜度就是真的\(O((n+m)\log w)\)了。
事實上那種錯誤的做法有人在Tutorial的comments里提到過,他也意識到是錯的了。


CF.1104D.Game with modulo(交互 二分)

\(Description\)
要求在\(60\)次詢問內猜出一個數\(a\ (1\leq a\leq10^9)\)。每次你可以詢問\((x,y)\ (0\leq x,y\leq10^9)\),交互庫會返回以下兩個字符之一:

  1. x,如果\((x\bmod a)\geq(y\bmod a)\)
  2. y,如果\((x\bmod a)<(y\bmod a)\)

\(Solution\)
考慮詢問\((x,2x)\)\(x\bmod a\)\(2x\bmod a\)),如果\(2x<a\),顯然結果是y\(x>a\),不好考慮;\(x=a\),結果是x\(x<a\leq2x\),結果是x。(為什么此時一定有\(x\bmod a<2x\bmod a\)呢...令\(2x=a+b=x+x\),因為\(x<a\),所以\(x>b\)。。)。
綜上,如果我們依次詢問\((0,1),(1,2),...,(2^{29},2^{30})\),我們可以找到一個\((2^k,2^{k+1})\),滿足\(2^k<a\leq2^{k+1}\)。這需要\(30\)次二分(最后一次不需要)。記這兩個邊界為\(l,r\),即\(l<a\leq r\)
考慮在\([l+1,r]\)中二分答案\(x\)。如果\(x<a\),顯然有\(l\bmod a<x\bmod a\);如果\(x\geq a\),同樣考慮拿\(l\)詢問,有\(l\bmod a>x\bmod a\)(還是令\(x=a+b\),如果\(b\geq l\),那么\(x>r\)顯然不對)。
這樣需要二分\(29\)次,那么就OK啦。
為啥都寫的那么簡潔啊...還是我太菜...


CF.1039D.You Are Given a Tree(根號分治)

\(Description\)
給定一棵\(n\)個點的樹。求最多可以選出多少條不相交的路徑,滿足這些路徑含有\(k\)個點。對\(k\in[1,n]\)輸出答案。
\(n\leq10^5\)

\(Solution\)
暴力是\(O(n^2)\)的,即對於每個\(k\)\(O(n)\ DFS\)一遍,能合並出一條\(k\)個點的路徑就合並,否則向上。這樣貪心顯然是對的(\(NOIP\)...)。
注意到答案是隨\(k\)增加遞減的,且\(k>\sqrt n\)時,答案的取值只有\([0,\sqrt n-1]\)\(\sqrt n\)種,我們可以二分每個值是\(k\)的哪個區間的答案。
需要做\(\sqrt n\)次,每次復雜度\(O(n\log n)\),總復雜度是\(O(n\sqrt n\log n)\)的。
\(k\leq\sqrt n\)時,可以對每個\(k\)暴力,復雜度\(O(n\sqrt n)\)
發現兩部分的復雜度並不均衡,\(k\leq T\)時復雜度是\(O(Tn)\),另一部分是\(O(\frac{n^2\log n}{T})\),所以取\(T=\sqrt{n\log n}\)時最優。

官方題解里有\(O(n\log^2n)\)的做法...(據作者本人說)很不好寫...


SRM577 Board Painting(最小割)

具體看這里叭,先不細整理惹。https://www.cnblogs.com/jefflyy/p/9679504.html
初始ans=總點數,每有一對點相鄰,就可以減少1的花費,這樣先算出一個答案。
然后把不合法的去掉。網絡流每跑出1的流量,就表示有一對相鄰的數不合法。這就是求割。要最小化去掉相鄰點對的數量,使得方案合法。


SRM558 Surrounding Game(最小割)

神啊qwq。https://www.cnblogs.com/Blog-of-Eden/p/7783406.html


SRM590 Fox And City(最小割)

類似切糕的拆點qwq。https://www.cnblogs.com/zbtrs/p/8608842.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM