20171218 DAY0 初相逢
今天的陽光很好,確實好極了。下午開始時,mercer說門外站了一堆人,我看都不用看就知道是衡水的。衡水人,怎么說呢,覺得還是挺不一樣的。不知道像凡哥和超哥這種奇異的生物究竟是如何得以存在的……可以想到,他們的生活確實十分的簡朴,一個年級可以被硬生生切成3塊,A部B部C部鼓勵無端競爭,每個部20個班,每個班80個人,一個年級就能有將近5000人之多。這簡直是難以想象的,SRS說“高四”更可怕,為了方便競爭,直接把牆硬生生拆掉,一個班就有了170個人。
他們才從會考的陰影中走出,NOIP之后的2周時間里,他們把3本歷史3本地理都嚼得粉碎。想到自己只有8天,還是感到了一絲絲的后怕。此外,他們聽說我們6:40起床的時候高興極了,因為他們5:40起床,要求5:45整隊……我立即問到,哪里來的洗漱時間?可以想見。於是他們繼續了,他們21:50下自習,要求22:00熄燈,中間還有10分鍾的自主學習時間。其實時間是相當的,但是如此卡時間真是難以置信。不過,基本的鍛煉時間他們還是有的,雖然不上體育課,但還有晨跑,5分鍾一頓的三餐之余也可以成立信息學競賽足球隊兩支。
怎么說呢?衡水的RYF, ZZH, WXH, ZYF......,黑龍江的Amphetamine,吉林的ZGZ, LKH, JCY, NKC......也都見到了。確實是很開心的。
20171219 DAY1
上午肯定要考試的。
T1先寫暴力,果不其然又推知了正解矩陣乘法。這個方法,好像還比正解優。不過,題目還是坑了我20分下來。“若答案小於等於9位,輸出答案,否則最后 9位”跟“%1e9輸出”是完全不同的概念。前導0真是坑,衡水的RYF過了這道題,做法是打表……一共有三個人被這個坑了,分別是CDQZ的WJ、ZJC、GYK。
T2看到就蒙了。雖然之后想到分開%p和%Phi(p)=p-1處理,卻始終沒有想到原根這一茬。但其實沒有想到原根也能得很多分,主要還是懶……不過,原根似乎也會有一點小問題。就是說,必須要使得gm≠x(mod p),據說這叫什么“二次剩余”。
T3是一道LCT,根到某個點就是access,但當時知道寫不出來就寫了O(dep)的暴力,理論上可以過40分,實際上數據水T了3個點。據說正解還需要找子樹,使用樹狀數組……
我今天80+20+70=170,WJ大佬80+100+0=180位居RANK 1。我覺得應該還是外地的各位大佬勞頓未休,再過幾天,一個二個都該是要強炸天了。
下午JCY講課,講LCT。ta為了說明LCT不是玄學,先在最前面細述了復雜度的證明手段,非常具體,我覺得這是很難能夠聽到的。講的很好,雖然之后幾乎全是說來輕描淡寫實則碼力十足的大坑題。最后,為了填充時間,還講了FWT(不知道這兩者有何關系),讓我恍然大悟:原來“IDT”就是FWT。
衡水的人表示很“不滿”,說JCY完全不按日程講。Hfu老師雖然曾經多次和我們討論過講課內容,但直到現在都沒有把具體日程給我們,我們也是半蒙半蒙的。
20171220 DAY2
上午還是照例考試的。看了T1和T2,覺得毫無思路,於是看T3。
最開始並不完全確定題意,於是按照自己的想法寫了個bruce過了樣例,題意就算是明白了。bruce是統計每一個區間對應的巡游,然后一條鏈一條鏈的扒出來,發現並不能有什么優化,雖然最后CDQZ有一個高一的貢獻了這樣的優化方法(不過他因為爆int失了20分)。然后轉變思路,考慮每一條邊的貢獻,沒有經過它的區間就是上下分離的區間。照着這個樣子想,就是n*(n+1)/2-∑k*(k+1)/2,k是子樹中每個連續一段的長度。最開始想使用set卻沒有想到辦法,於是輾轉之后想到了線段樹。自底向上,可以使用線段樹合並。而如何快速的查詢呢?只需要存前后綴連續一段的情況,與中間非前后綴的已有sigma就可以了。最后詢問的時候需要加上前后綴的影響,而在合並時直接合並就是了。中間貫穿與不貫穿的情況很有趣,update最后居然寫了25行之多。不過,因為這樣的合並在每個葉子上是沒有重復的,像是永無鄉那樣,可以證明最后合並的復雜度和一個一個插入的復雜度O(nlog n)是相當的。最后的復雜度就是O(nlog n)*O(update)了,這里專門把update列出來,還是因為它太長了。
不過,我當時沒有想通的set卻讓LKH想了出來。他們如此寫,最后的復雜度就是O(nlog2n),畢竟set不是splay。
WQ寫O(n2)暴力,我覺得這也是很巧妙的。他枚舉區間的每個起始點,然后考慮每條邊的貢獻,使用我的想法,就是求出子樹中>該點的最小值。
T1統計水平線段和豎直線段交點到4個端點距離最小值的最大值。暴力可以過,因為前50%1000后50%隨機。但是,我可能剪枝不夠優,沒有卡滿。正解是二分答案+掃描線,就是每條線段只保留合法交點的一截長度,於是只要有交點即可。之后,水平線段就可以當做區間查詢,豎直線段在合適的時候加入,統計一段出頭的是否足夠長就可以了。
T2是一道線性基,不會不會……
下午和Amphetamine打乒乓打得很開心。
20171221 DAY3
上午照例考試的。
T1大水題,枚舉A-B的因子就好了。但是失了5分,是因為沒有判斷A==B的情況。自己的分類討論向來不是很優秀,還是要多加努力的。
T2當時看見逆序對,看見n≤600,驀然想到了三次方的行列式。但直到最后也沒有寫出來,是因為不確定方案統計的是匹配還是匹配下的路徑。此外,“路徑兩兩不相交”讓人十分頭疼。
中間,ZJC進來問過一次問題。就是一個點如果既無出度亦無入度,應當算作兩個。想來很顯然,但有個人寫了“else”只有80。而至於“路徑兩兩不相交”怎么辦呢?考慮到“路徑兩兩不相交”=“路徑可交”-“路徑相交”,行列式算出的是“路徑可交”,而“路徑相交”的情況一定可以兩兩配對相加為0。所以根本不用考慮,確實非常非常妙。
T3是一道回文樹,詢問一個回文串是已經給定串多少子串的后綴,不要求本質不同。因為不要求本質不同,所以不是統計fail樹子樹siz,而是統計fail樹中下面結點到子樹根的距離和。前80分是先修改后詢問,所以統計可以放在最后。而后20分則不同。如果離線,則可以對操作數分塊解決,更高效的可以樹鏈剖分;如果在線,則可以使用LCT。
但是,DSFZ的TXL覺得這樣實在過於naive。他認為我們對回文樹的了解過於淺薄,其實只靠回文樹本身就可以了。當時花了很久來研究這個,其實是這樣的。加入一個串后,答案有變化的節點一定是該串的回文子串節點。而一個串的,是用歸納法證明最長回文后綴才可能是新增的。把每個走到的節點last壓入棧中,再使用一些數組存新增量即可。
不過,JCY給出的卡法也是很優秀的。如果允許在一個串后再加一個串,那么JIJI就是必然的了。
下午講課。JCY的DS實在是太長了,我覺得如果能把這上面的所有題都做了,DS應該不會特別弱。實在是誠意之作啊。
之后還是和Amphetamine打球,順帶帶上了昆爺。特別爽快。
今天,主要還是做了另一件事:總結數論體系。大概整個體系已經理出來了,自己在哪里掌握的很好,在哪些地方還很有欠缺,基本上都齊全了。
20171222 DAY4
今天照例考試。
T1看上去比較難以解決,但實際並不然。JCY說NKC本打算把這道題出成T3防AK,然而此題有十幾人AC了。我的思路是模擬題目的過程,使用平衡樹維護一個函數數組。查詢直接查詢,維護其實就只是刪數。說來也可以算是DP優化。而YYF的做法是二分+樹狀數組,單點+tag,二分詢問點,復雜度O(nlog2n),但代碼好寫。而WQ的做法是正着for,在加入第i個數的時候考慮第1~i-1個點的變化,即使用平衡樹中間按信心值排序。
ZJC說他讀錯了題,幸好最后發現,及時寫了暴力,救回了50分。所以說,題目還是要謹慎理解的。如果連題意都看錯了,一定是很艱難的。
T2和T3都是數論,覺得自己數論的盲點確實還是有的。
T2的題意:給您k個n-1維空間,問能夠把一個n維空間分成幾個部分。1維顯然,2維顯然,3維1個平面2個平面3個平面顯然,然而在3維4個平面上長久的卡住了。表打不出來,推理也難的想了。
這樣的答案矩陣有幾個特性,如果打表可供發現:
1.在n維空間下,加入若干個n-1維空間的答案序列為n-1階等差數列。f(n,k)=f(n,k-1)+f(n-1,k-1)。→很顯然,k≤n時,f(n,k)=2n
2.在放入k個向量的時候,如果是n維空間,答案很像∑C(i,k)。→很顯然,k≤n時,f(n,k)=2n
於是,我只知道二維是等差數列,只知道上面的兩個很顯然,於是騙了65。中間也想到過第一個現象,但是因為去鑽T3了而未發現。
至於是為什么呢?WJ大佬講的很好。類比2維,n維中加入第k個n-1維空間時,只需要考慮增量。關鍵在於增量怎么統計。很顯然的是,每兩個n-1維空間都有“交點”n-2維空間。而增量就是k-1個n-1維空間和第k個n-1維空間的k-1個n-2維交點對這個加入的n-1維空間的划分數。這個結論看上去不是很顯然,但確實如此。因為這樣划分出的n-1維空間,就是新切割出的n維空間的界限。於是第一條得證。
而第二條,使用數學歸納法易證。硬要證,可以補全負維空間,然后考慮每個0維的貢獻,每個的路徑數就是C(i,k)。
T3是一個幾乎完全未知的領域。n和k都很大,最開始以為是O(1)的,然而遠非如此。Polya定理,所有置換中一種方法置換等於自身的方案之和的平均值就是置換同構的方案數。然后,考慮旋轉m下,一種方法置換等於自身一定是有gcd(n,m)的循環節(類似字符串中KMP找循環節的理論)。於是,答案就是(1/n)*∑d|nphi(n/d)*a(d)。中間a(d)指長為d的循環節首尾不同相鄰位不同且至多選擇k種顏色的方案數,中間最重要的是不考慮旋轉同構。有DP方程式:a(d)=(k-1)*a(d-2)+(k-2)*a(d-1)。前一半指的是第d-1個位置的顏色欽定與第一個顏色相同的方案數,a(d-2)中d-2號位置肯定和1號不同。后一半就是d-1≠1的情況。這個式子經過一番化簡之后,可以得到:a(d)=(k-1)n+(k-1)(-1)n。
在這里%一發WJ大佬。這個方程可以怎么得到呢?有一個顯然的事實,這樣的常數遞推方程一定有通項。使用特征方程x2=(k-1)+(k-2)*x,可以算出兩個特征根:x1=-1,x2=k-1。於是,通項一定是an=A*x1n+B*x2n,A和B為常數。因為a1=0且a2=k(k-1),列方程待定系數可得A=k-1,B=1。
於是,可以枚舉因子d並求出其phi。然后,使用快速冪算出a(d)。最后當然還是要求出逆元n-1的。使用試除法是O(sqrt n)的,但是如果使用pollard-rho和miller-rabin就會高效的多。
注:中間那個DP方程式挺像錯排的,f(i)=(i-1)*[f(i-2)+f(i-1)]。i-1是欽定之前的位置,f(i-2)指該位置放在i號位上,f(i-1)指該位置不放在i號位上的i-1個點的情況。
下午,JCY的數據結構講了很多。之后再講雜題。雜題中有很多好題,可是總覺得自己時間很緊,太緊了。
晚上,學習了一下無旋treap。無旋的treap也是需要rd的。split呢,需要返回一個pair然后如是合並。merge呢,如果兩棵樹保證完全的單調,則可以像左偏樹那樣合並。如果沒有完全的單調性,則必須啟發式合並。"啟發式"呢,就是小的一個一個往大的插,單個就是O(log)的,啟發式又自帶一個O(log)。至於為什么要學無旋treap呢?因為無旋treap不像splay均攤復雜度,而又可以方便的split。當treap帶上split和merge的時候,大概rotate也會成為一個廢物的操作吧。
20171223 DAY5
T1其實不難,中間也想到了。因為k只有500000,所以很明顯要按照列推。中間一行對應上面兩個, 如果把式子寫出來就AC了。但是我卻並沒有把式子寫出來,中間的思路都是混沌的(也怪自己的草稿紙太不爭氣)。就是說,思路應該連綴成文,這個樣子才不會昏。
我左邊那個叫做ZJC的大佬說,這么水的題我卻爆了int,實在是太可惜了。我立即膜了一發,說您實在是太強了。什么一天出鍋三天補鍋,您這么強的人就沒有出過鍋。ZJC搖了搖頭,說你實在是太無聊了,像我這么強的人就不用你膜了,如果你實在要膜就跪下來吧。我立即明白了,原來大佬也是有骨氣的啊。
至於為什么我第一題是0分?因為我n, k, b的順序出了錯。而WJ的第一題?編譯超時?是因為他定義了一個1e7的數組,然后使用“={1,1}”,強迫g++幫他打一個1e7的大表,而g++說拒絕。
T2是一個很巧妙的DP。f[x][y]表示x和y是否可行,而f[x][x]一定可行。轉移很簡單,x走2步y走1步,對應狀態轉移。不過,這樣復雜度無法保證,使用菊花圖就可以輕松的卡掉了。於是考慮拆分狀態。f[x][y][0]表示該x走第一步了,后繼狀態f[x'][y][1]。f[x'][y][1]表示該x走第二步了,后繼狀態f[x''][y][2]。f[x''][y][2]表示該y走第一步了,后繼狀態f[x''][y'][0]。點對(x,y)可行當且僅當f[x][y][0]可行,初始時f[x][x][0]可行。倒推更方便,建反圖跑BFS。但是建正圖跑記憶化搜索也可以,但是會出現環的情況比較麻煩。
T3之前考過,YYF的分階段方法確實很優。而我使用的是分治,統計過mid的區間答案,單調指針+2-pointer&bucket維護。而YJQ使用的做法也很巧妙。他從左往右枚舉右邊界R,於是左邊界可行當且僅當max-min+L-R=0。而max-min+L-R≥0, 所以只需要維護區間最小值與個數即可。然而,max和min的變化又如何統計呢?使用單調棧,彈出一個元素就修改其值所對應的區間即可。
下午終於是YJQ大佬了(JCY大佬當然也是強炸天的角色)。中午我打飯的時候,突然后面冒出一個聲音:你們食堂什么好吃啊?可是嚇了我一大跳。吃飯的時候,YJQ大佬談笑風生,說他們那個ACM隊(中間有翁文濤)和任之洲那個隊與杜渝浩那個隊gang。本來穩操勝券,無奈參加一場比賽以兩道大模擬壓軸,碼力不夠終被刷下。而THU的教練本來力保任之洲,於是之后的一場比賽中,不讓YJQ隊參加而讓一個更弱的隊參加。更無奈的是,那個場是一個“SB場”,弱隊碼力過強最終入圍World-Final。XGG也要參加明年7月在P大的World-Final,YJQ本想乘此機會再會“朱瘤”無奈要回家。
從這個故事中,我們可以認識到:一個人要較為全面的發展,提高碼力,才能減少翻車的可能性。
下午YJQ講圖論,終於沒有全場蒙了。但是,n個結點的SCC/BCC/二分圖的計數到底是什么鬼?
還有,單雙樹確實很有趣。WQ確實是深有造詣,一般有兩種構造方法。第一種是以割點為界,但有局限性。第二種是把每個點雙列出來,點雙上的點連向該點,史稱“圓方樹”,十分高效。
20171224 Day6
上午照例考試。
T1詢問區間的絕對眾數。絕對眾數,就是MODE那玩意兒。不過,此題做法確實很多。
法一,CDQ 或 位置線段樹 + vector 或 按權值分每個根的位置線段樹。做法是前者維護出每個區間的可能眾數和殘留次數,后者用於驗證。一個是離線的,一個是在線的。
法二,主席樹。權值線段樹+前綴和,查詢的時候siz相減往人多的方向走。
法三,rand find。這是一種非常優秀的方法,因為一個區間如果有絕對眾數,那么隨機選出一個數來就找到的概率超過一半。如果做很多次,就幾乎不會失敗。好寫好調,推廣容易。
法四,分塊。因為時間最后給了4s,所以能過。
但是,所有區間絕對眾數的∑該怎么統計呢?
T2是裸的O(nlogn)石子合並,樓教八題之一。使用Garsia-Wachs貪心,再帶上平衡樹優化或者像ZJC一樣卡常數就能過了。
T3是一道很不錯的網絡流。朴素的最小割很容易卡,如果具體分析原因其實是這條路徑割上游,那條路徑割下游,然而可以走這條路徑的上游和那條路徑的下游,如何避免?考慮到那條路徑的上游和這條路徑的下游是沒有割的,中間的邊如果可以反着走那么就可以很好的避免這種情況的發生。另外又是最小割,於是就好了。
下午YJQ講網絡流建模。中間幾乎所有題都是方格圖,絕望。
之后,打球。RYF打球很強的,特別爽。
晚上,ZJC把鍋甩給我,居然讓我講KAND。我要從位運算開始講起,講如何容斥,講如何枚舉子集,講為什么是3n,講什么是FWT,講分治。基本上沒有什么人聽,覺得自己好廢物啊……
好廢物啊………………
20171225 Day7
作為一個新晉升的十七歲廢物,百感交集肯定是有的。家里面很給力,不過送來的確實太多了。二十多個橘子五十多粒桂圓,這分明就是讓我和班上的同學私分了嘛!幾十塊姜餅,照例是要孝敬生活老師一盒的,在機房里送了一盒半(每人一塊人人開心),剩下來的就用於補充蛋糕之不足了。對晚上七八個人圍在一個小蛋糕之前的神奇情景感到好奇和恐懼。
今天一整天都在講高端數論,老師姓陳,大三,電子科大,ACM錯失一隊。他高中時完全沒有接觸,兩三年來確實很強。今天一開始,他就說:FFT是今天最簡單的東西。FFT,FWT,生成函數(!!!),莫比烏斯反演,杜教篩,Polya和Burnside,線性基……其實他講的挺好的,只是可能還是經驗不足。一旦讓人棄療,則下面就會大亂而不可收拾。棄療的人,自然也是良莠不齊的。而且還有很多人打打笑笑吵吵鬧鬧,分明就是砸場子的。之后我在高一講課的時候,一定也要注意這種情況。第一,必須卡緊時間,並時刻給人暗示,如果有東西需要大家思考,也不能放任時間流逝。第二,板書必須足夠工整,語言必須足夠清晰,准備的內容必須合當,如果亂寫亂畫亂說一通,則會給人一種消極的感受。第三,如果有人圍上來問問題,若此時下面正在想問題,就可以卡緊時間稍作解釋,之后再對着所有人講,否則就讓他坐回位置讓他講,然后直接對着所有人解釋。第四,一定要對自己所講的東西充分了解,才能不緊不慢,不被別人問倒並讓人清晰了解。不過,東西不宜講的過透,需要留給人思考的余地。
生成函數真心強!!!
20171226 Day8
這是炸了的。硬gang第一題,只根據每個點的答案而不考慮是怎么得到的,這樣的打表確實是不行的。雖然最后還是找出了規律,但實在是太不優。考后竟然還埋怨別人不停咳嗽,實在是大錯。最后,T1也只有60分,原因是寫成了“prime[B/1000]”,遠遠越界,和爆int可以相提並論。
T1可以證明。因為cos可以合並,最后答案就是φ+μ啦。使用杜教篩1e8可以滿分,使用線性篩1e7可以85。
T2是一道點分,或者是樹鏈剖分“優化DP”。O(dep)的暴力可寫,但是因為時間分配不當最后只寫了20分。
T3是一道網絡流。實質上是兩道題,第一道是交換糖果,第二道是分配01並求最小值。很優秀的復雜度。
下午陳老師講博弈論和計算幾何。博弈論是沒有辦法指望別人聽的,但是計算幾何講的還是真心好。他的算幾應該是很不錯的(他說博弈論水一下就是的)。
20171227 Day9
上午考試,XGG命題。題面非常高大上。
T1,是一道看似復雜度不對但其實可以證明的。使用map記憶化搜索,並用ST表輔助二分找到對應拐彎點。證明過程非常優秀。
T2,是一道NOIP訓練時做過的題目,而且我本來還打算給高一的講(雖然最后因為時間原因沒有講成)。信心滿滿覺得自己可以AC,無奈最后只有10分。一看,呀,memset寫錯了!其實,最開始我寫成了“sizeof(n+1)”后來第三題也這么寫,發現掛了才匆匆改成“sizeof(int)*(n+1)”。卻沒有深入思考,其實應該寫成“sizeof(f[u])”的。畢竟是三維的數組,如果像二維那樣寫還是很不一樣的。以前,LMY說他不敢這么寫怕掛,當時我還笑他。后來,NOIPGR時,做一道二分圖的原題,也掛了就是memset的原因。還是應該吃一塹長一智才行的。
T3,是一道很不錯的網絡流。應該還是自己狀態比較好,時間比較充裕,才寫了出來。中間有一點沒有想到,就是總的流量跑下來是一定的(單峰函數來源),於是並沒有必要三分套網絡流,而是先跑出總流量三分出對應點,再跑一遍網絡流並構造方案。構造方案是很巧妙的,要從一組可行流中剝出一個可行流,使得和另一個同向。這個其實可以分flow,像DINIC的DFS那樣跑。因為三分套網絡流,於是T了一個點,無論如何也卡不過。
晚上講課,我自己已經准備已久了。充分的准備肯定是有好處的,當然占時間也沒有太多。不過還是出了小問題,就是沒有想到PowerPoint 2016與2007的兼容性都那么差!匆匆修改,終於上台。似乎同學們都挺專注的,頹的確實不多。覺得自己很有成就感。畢竟為了遴選講課內容,還是總結了很多老師講課的優缺點的。
有人問我要QQ,但我不上QQ啊QAQ!於是給了他們我的email,如果他們找我,我應該還是會認真答復的。
20171228 Day10
這一天,嗯……
T1,大型演習。暑假的時候XGG出過一道叫做project的題目,這道題目是在那個CDQ+單調棧的基礎上再加上主席樹的。好神啊……
T2,柚的策略。這道題的標解是O(n3)的,但ZH的ZZH大佬給出了O(n2)的做法。
T3,加帕里圖書館。是一道區間字符串統計DP,不會不會……
下午,XGG講DP優化。實在是太神了。
20171229 Day11
快要結束了呢。今天的題也特別有意思。
T1,奇諾之旅。最大基環森林可以用KRUSKAL的擬陣做,空集獨立遺傳性擴充性,擴充性最難證,但這種問題似乎直覺打表也可以……T3腦洞了太久,我只來得及寫O(n2)的做法。問題思考的還是不夠深入,離線的連並查集都不用。其實還是不願意深入思考。因為是離線的,只需要把非基環樹的邊的影響統計了就可以了。因為是直接修改至環,所以並不需要並查集這樣高端的操作。分類討論其實並不復雜。
T2,占卜的准備。Impossible完全是拿來唬人的。每次選x坐標最小的,選最靠上或是最靠下的,方案一定構造的出來,而且一定不會相交了。當時糾結是寫階乘級的還是random_shuffle,最終只得了10分。中間沒有判交的操作,如果判了交不知道能否有30……
T3,空白的棋盤。這是一道通信題,非傳統題。題目給了一個grader.cpp和一個grader.h,你需要寫出兩個程序shiro.cpp和sora.cpp。題目是這樣的:一個128*128的棋盤,A最開始在(s,t),B想讓A走最短路到(ex,ey)。他們之間的交流,僅僅限於給棋盤的每個位置賦值01。除此之外,A走的段數還不能超過29。這是一個分塊的做法,每一行四位編碼,對應於跳21~26。在同一行間再分跳1步和跳sqrt步。總體過程就是先上下跳,再左右跳。中間行與行花色和純色交替,一切都很清楚了。
當時考試時,一直想的是左右上下交替跳。於是一直都很卡。
下午,是XGG的雜題專場。先是擬陣,后是JOI的通信題專場。后者就是亂搞專場啊!!!
未完待續……
