總之就是 | 一堆雜題


前言

這里是我從 2021.4.12 開始的做題記錄,每個題目都有大約的講解思路(有些偷懶就直接放的題解的鏈接

這里的每一個題目都沒有標程,但是都有題目的鏈接,可以根據右面的目錄點到對應的題目去

這里的題目是按照我做的時間順序排放的,難度主要是 黃 \(\to\)\(\to\) 藍的樣子。

非常不要臉的在這里加個目錄(雖然貌似洛谷不能識別 TOC 的樣子,但是本來就是想讓你去博客園看啊ww)

2021.11.4 UPD

目錄

1 | P1144 最短路計數

P1144最短路計數 [普及+/提高]

由於這道題的特殊性(所有邊的邊權都是1),所以我們可以只進行簡單的BFS

由於要求最短路,所以當前在求的點\(i\)的上一個點在搜索樹種一定是來自於上一層,不可能來自同一層,所以到點\(i\)當前路徑的長度只需要讓上一層的那個點對他進行更新即可

再因為本題的\(ans\)要求的是到\(i\)點的最短路的個數,所以如果到點\(i\)的當前路徑的長度等於上一層的每一個點的路徑+1,那么這肯定是到點\(i\)的最短路

2 | P1352 沒有上司的舞會

P1352沒有上司的舞會 [普及/提高-]

這是我第一次做有關樹形DP的題目,因為題目難度不高,所以還是比較好想的
S
\(f_{i0}\)是當第\(i\)個人不參加舞會時的\(max\)\(f_{i1}\)是他參加舞會時的\(max\)

根據題目所給到的關系,當一個結點(人)的父節點(領導)來的時候,這個人是不參加舞會的,所以對於\(i\)的下屬\(j\)就有,\(\begin{cases} f_{i0}=max\{ f_{j0},f_{j1}\} \\ f_{i1}=a_i+f_{j0}\end{cases}\)

這里的\(a_i\)是每個人的歡樂值(結點的權值)

可以顯然得到的是,上述柿子只有從根節點開始才能計算出對於每個節點的\(f_{i0} , f_{i1}\),從而才能算出對於根節點的\(f_{root0},f_{root1}\),最后\(ans=max\{f_{root0},f_{root1}\}\)即可

那么我們就需要找到\(root\)的編號,根據本題的特殊性,\(root\)結點即為沒有上司的結點,在輸入關系的時候我們用一個\(bool\)數組來標記即可,全部輸入完畢之后,再根據標記來判斷\(root\)

3 | P1015 回文數

P1015回文數 [普及-]

其實做這道題的初衷是為了讓橙題AC數量湊個整數

這道題其實按照題目的要求進行模擬即可,每次將一個數的位數正序與逆序相加,需要用到高精。對於大於10進制的情況,將其每一個用字母來表示的位對應的轉化為一個十進制數即可

4 | P1158 導彈攔截[NOIP2010PJ]

P1158導彈攔截[NOIP2010PJ] [普及/提高-]

看似這道題是和另外一道DP題重名,實際上這個題是一個排序+模擬,因為只有兩個導彈系統,所以我們考慮用第一套攔截較小范圍的,第二套攔截較大范圍的

在用到第一套系統的距離進行排序,然后依次枚舉即可

5 | P1190 接水問題[NOIP2011PJ]

P1190接水問題[NOIP2021PJ] [普及-]

這題就真的是老水題了,模擬一下接水過程即可

6 | P1309 瑞士輪[NOIP2011PJ]

P1309瑞士輪[NOIP2011PJ] [普及/提高-]

這道題是一個很典型的歸並排序

主要思路就是每次維護贏家和輸家兩個數組,然后在每次比賽之后進行歸並

在最一開始使用sort排序一遍,然后每次比賽完之后merge即可

PS:STL中是有merge的:

merge函數的作用是:將兩個已經排好序的序列合並為一個有序的序列

函數參數:merge(first1,last1,first2,last2,result,compare);

實際上就可以這樣用:

inline bool cmp(int x,int y){return x<y;}
int a[114514],b[114514],c[114514];
...
merge(a+1,a+114514,b+1,b+114514,c+1,cmp);

7 | P1982 小朋友的數字[NOIP2013PJ]

P1982小朋友的數字[NOIP2013PJ] [普及+/提高]

我直接推薦第一篇題解

8 | P1095 守望者的逃離[NOIP2007PJ]

P1095守望者的逃離[NOIP2007PJ] [普及/提高-]

能閃則閃,否則就走,若能力值夠了就恢復,最后將本次的值進行比對,

看是這次 走 快還是 停下來恢復 或 閃 快

9 | P2398 GCD SUM

P2398 GCD SUM [提高+/省選-]

\(f_i=\gcd(i,j)=k\)

\(g_k\)為能被k整除的\(\gcd(i,j)\)的個數

很明顯就有\(g_k=\sum\limits_{t=1}^nf_{t*k}\),因此\(g_k=\lfloor\frac{n}{k}\rfloor^2\)(對於i有floor(n/k)種,對於j也一樣)

10 | P1390 公約數的和

P1390公約數的和 [省選+/NOI-]

思路和上一題基本一致,最后答案輸出時\(\frac{ans-k}{2}\)即可,其中\(k=\frac{n(1+n)}{2}\)

11 | P1541 烏龜棋[NOIP2010TG]

P1541烏龜棋[NOIP2010TG] [普及+/提高]

很明顯的一個DP題,且方程是比較好推的

由於題目中說了一共只有4種卡牌,且對於100%的數據:每種牌的數量都小於等於40

因此我們可以開4維數組,\(f_{xyzw}\)代表分別用x張1,y張2,z張3,和w張4所能得到的最大值

那么就可得出方程:

\[f_{xyzw}=max\{f_{xyzw},f_{x-1yzw}+a_{x+2y+3z+4w},f_{xy-1zw}+a_{x+2y+3z+4w},f_{xyz-1w}+a_{x+2y+3z+4w},f_{xyzw-1}+a_{x+2y+3z+4w}\} \]

當然,前提是保證計算\(x-1,y-1,z-1,w-1\)時,對應的\(x,y,z,w\)都不為0

12 | P3842 線段[TJOI2007]

P3842線段[TJOI2007] [普及/提高-]

DP,在這里是設置了二維的一個狀態,\(f_{i,0}\)表示從第i行最左端開始走的最短路徑長度,\(f_{i,1}\)則是到第i行最右端開始走的最短路徑長度

那么除了第一行外,當前的從左端點開始走的最短的路徑就是上一行的對應的左端點+上一行的線段的左端到這一行的線段的右端的長度+這一行的線段長度+1。或者是從上一行的右端點來(計算方法同理,將左端點改為右端點即可)。

當然,從右邊開始同理。

那么狀態轉移方程就是這樣的:

\[f_{i,0}=\min\{f_{i,0}+dis\{x_{i-1,0},x_{i,1}\}+dis\{x_{i,0},x_{i,1}\},f_{i-1,1}+dis\{x_{i-1,1},x_{i,1}\}+dis\{x_{i,0},x_{i,1}\}\}+1 \\ f_{i,1}=\min\{f_{i,0}+dis\{x_{i-1,0},x_{i,0}\}+dis\{x_{i,0},x_{i,1}\},f_{i-1,1}+dis\{x_{i-1,1},x_{i,0}\}+dis\{x_{i,0},x_{i,1}\}\}+1 \]

13 | P2016 戰略游戲

P2016戰略游戲 [普及/提高-]

一個最為基礎的樹形DP

通過觀察樣例我們可以發現:實際上只需要考慮對於某個節點,我們只需要考慮這個節點要不要放士兵即可

那么我們每次取放/不放的最小值即可

14 | P1359 租用游艇

P1359租用游艇 [普及-]

樹形DP,先存邊,然后遍歷n的上游和i的下游節點,比較路徑長度即可

15 | P1122 最大子樹和

P1122最大子樹和 [普及/提高-]

樹形DP,先存邊,然后進行兩個DFS

16 | P1747 好奇怪的游戲

P1747好奇怪的游戲 [普及/提高-]

BFS,做這道題的初衷是為了復習一下搜索,感覺自己快忘了

最一開始提交竟然WA,原來是BFS第二個時把BFS(X2,Y2)錯寫成了BFS(X2,Y1),草(一種植物+中日雙語)

17 | P1746 離開中山路

P1746離開中山路 [普及/提高-]

BFS,和上面那道題基本一致

簡單的打了一遍模板,修改幾個參數就好了(

18 | P2615 幻方[NOIP2015TG]

P2615幻方[NOIP2015TG] [普及-]

不是吧2015年的D1T1就這么水

做題的初衷是為了完成任務

一眼知模擬,所以就按照條件簡單做就行

因為數組表示起來不是很好想,直接放棄使用數組下標

選擇用結構體,求每個數字的坐標,最后再賦值給數組以便輸出,中間走樣例炸了一次,是沒做位置是否有數的判斷,因為懶得再去大改,而且這題范圍允許,就維護了一個bool數組

做的時候覺得應該能煺柿子,AC完一看題解,還真有公式啊

19 | P2298 Mzc和男家丁的游戲

P2298Mzc和男家丁的游戲 [普及/提高-]

BFS,和前面的P1746思路基本一致,典型的迷宮+BFS,維護一個dis數組即可

但是分析的時候錯誤的打了個else導致我調了二十分鍾???

20 | P1332 血色先鋒隊

P1332血色先鋒隊 [普及/提高-]

看完題面第一反應:好!我是叛徒

BFS,但不完全是BFS板子,這是多起點多終點的

啊那就直接把起點全部壓進隊列去不就行了么

然后更新dis,最后按照順序輸出即可

然后我因為BFS函數沒調用查了≈40min???

感謝!已經氣懵了

21 | P1141 01迷宮

P1141 01迷宮 [普及-]

別看這是一道普及-,這題可比前面的5道題強多了

首先輸入需要用字符串,迷宮類問題常規操作,還行

然后這題如果直接按照輸入數據一組一組的BFS的話最多拿70pts,會TLE三個點

那么我們考慮計算連通塊,然后輸出要查詢的點所在的連通塊的大小即可

22 | P1162 填塗顏色

P1162填塗顏色 [普及-]

哦,又是一道普及-

這道題做法很多,我在這里考慮DFS

因為在題目當中0有兩個意思,所以將他們換成不同的數字在進行分析

但是不能直接DFS,那樣會把邊緣誤塗,應該先DFS一邊邊緣,再進行正常DFS,所以最一開始輸入的是DFS(0,0)

23 | P1683 入門

P1683入門 [普及-]

哦,雙是一道普及-

這道題顯然的DFS,甚至還不用回溯,找到起點直接DFS即可

24 | CF414B Mashmokh and ACM

洛谷:CF414B Mashmokh and ACM [普及/提高-]

CF:Codeforces Round #240(Div.1) ##B

搜索做累了,水一個DP

由於對於一個數而言,它的因數並不好枚舉,所以在這里考慮倒退,即去推某個數的倍數

25 | P1586 四方定理

P1586四方定理 [普及/提高-]

DP,狀態很好想,是一個類似部分背包

由於是多組數據,可以先預處理,然后把輸入的數據的f[n][1~4]加起來就行

26 | AT1350 深さ優先探索

AT1350 深さ優先探索 [普及/提高-]

顧名思義,這是AtCoder的DFS模板題,鍛煉一下DFS用的

27 | P1387 最大正方形

P1387最大正方形 [普及/提高-]

智能推薦的題,DP

由於給了圖,而且n和m都小於100,所以上手模一下圖大概的柿子就有了

本題實際上只需要對數值是1的點進行操作,所以以當前這個點為頂點的最大的不含0的正方形的邊長就是它的上,左,左上端點的最小值再加一,柿子大約就是:

\[f_{i,j}=\min\{f_{i-1,j},f_{i,j-1},f_{i-1,j-1}\}+1 \]

28 | P1157 組合的輸出

P1157組合的輸出 [普及-]

DFS,但是我白給了,完全不會DFS.jpg

實際上思路很好想,從1開始搜,然后搜每一個能符合的下一個數,如果當前搜到的位數大於r了,就輸出+回溯

但是我就是不會打(

最一開始看到這個題突然想起來有個東西叫做next_permutation,然后看本題的推薦題目,發現有一道裸的輸出全排列(P1706全排列問題 [普及-]),就順便用這個STL函數搞了一下

29 | P2372 yyy2015c01挑戰算周長

哦我又雙叒叕在DFS上面白給了

P2372yyy挑戰算周長 [普及-]

DFS,一上來就讀不懂題,樣例都看不懂

看了一眼題解發現原來是對於每個中心的X,只有它的上下左右才算周長,否則不算(比如說角上就不算)

30 | P1681 最大正方形II

P1681最大正方形II [普及/提高-]

是剛才上面那道題的變式,實際上只需要多開一維數組來表示當前是0還是1了

這個數據范圍搞得我嚴重浪費評測機資源

31 | P2426 刪數

P2426刪數 [普及/提高-]

區間DP,我沒見過

准確來說是我忘了,但是看題解說這個題比較水

不過也確實比較水,因為從頭上刪除和從尾刪除到了最后應該是等價的(也就是從頭上刪除的最優解留下來的部分也正是從尾端開始的最優解)

最一開始過不了樣例,因為我把求值的公式打錯了(誰讓題面上沒用\(\LaTeX\)呢)

看到樣例答案突然就想諷刺一下膏通的某擠牙膏SoC

32 | P1036 選數[NOIP2002PJ]

P1036組合的輸出 [普及-]

一道NOIP的上古題目

DFS,和昨天那個組合數類似,都是確定當前數字的基礎上確定下一個數

本來是想打一手歐拉篩預判一下,結果發現不是很好用,於是乎打完就去掉了,換成了試除法

33 | P1063 能量項鏈[NOIP2006TG]

P1063能量項鏈[NOIP2006TG] [普及+/提高]

眾所周知這是某本書的區間DP的例題,但我沒看那本書的區間DP

好久沒做綠題了

區間DP,首先這題數據是個環,我們需要破環成鏈,實際上只需要在數組里面再復制一遍數據就可以

我們從中間選一個點k,然后每次比較i到j的原值大還是從中間選一k點得到的值大

最后找一個最大值即可

34 | P1605 迷宮

P1605 迷宮 [普及-]

不是吧不是吧不會這個題也有人不會吧

Dfkuaid_First_Search,實際上就是每次擴展結點簡單DFS即可

但是我最一開始忘了判斷是否越界&起點設置為已經過而WA

說明我DFS還是8行

35 | P1005 矩陣取數游戲[NOIP2007TG]

P1005 矩陣取數游戲[NOIP2007TG] [提高+/省選-]

終於是把我主頁智能推薦天天在推薦的題調出來了

實際上是一個區間DP,我們每行維護一個最大值,最后加起來即可

對於每一行的每一個數,當要去掉的數到它時,它的最大值一定來自它的左邊或右邊,因為只能從兩頭進行操作

然后就是高精度,感謝,已經快敲死了

實際上第一次模着題解寫對了99%,但是當把每一行的最大值加入ans的時候忘了給每一行的最大值賦值時清空了😂

36 | P1019 單詞接龍[NOIP2000TG]

注意:本題為上古 NOIP 原題,不保證存在靠譜的做法能通過該數據范圍下的所有數據。

P1019 單詞接龍[NOIP2000TG] [普及/提高-]

一道比較巨大的DFS,很考察細節,思路不難想,問題是怎么一點一點的把細節摳出來

37 | P4170 塗色

P4170 塗色 [普及+/提高]

說實話好久沒做題了

這個題是一個區間DP,考慮一個特殊的判斷,即為枚舉到相同時直接繼承,剩下的就是經典的區間DP,枚舉一個斷點進行計算

38 | P2014 選課[CTSC1997]

P2014 選課 [普及+/提高]

一看年份就知道是一道上古的CTSC題目,我們先來看這個題面

題面中提到很多課程都會有其預備課程,然后再根據本題輸入的數據的特點是輸入0即為沒有前繼節點,於是這句話可以翻譯為:這是一棵根節點為0的樹

沒錯,這道題分析到這里就應該能看出來是樹形DP了

首先是進行常規操作,用鄰接表來存下這些邊,生成一棵樹

於是我們就從最小內容的節點開始拓展(遞歸),也就是從 Root 開始DP

這里設計的方程是 $ f[j][k] $ 是指前 j 個節點選了 k 節課,我們可以從根節點開始,順着樹進行DP(DFS)

39 | P2015 二叉蘋果樹

P2015 二叉蘋果樹 [普及+/提高]

顧名思義,這是一顆樹,並且還是二叉樹

這里推薦一篇54級學長的[樹形DP入門]

學長講的真的挺好的,推薦去看

HD只能在這里粗略的重復一遍,實際上就是考慮到每個節點的數據都是由他的子節點傳遞過來的,因此我們在找方程的時候就要找當前節點和它的子節點的傳遞/遞推關系

40 | P2880 Balanced Lineup G + P2251 質量檢測

Balanced Lineup G

質量檢測

之所以把這兩個題放在一起,就是因為這都是ST表的板子題,前者只需在ST表板子的基礎上維護一個最小值,然后查詢的時候輸出 max-min 即可

后者只是把查詢的區間改為了一個規定的柿子,傳參的時候注意一下就可

41 | P1816 忠誠

P1816 忠誠 [普及/提高-]

我是真的沒想到ST表居然這么多板子題(雖然說相比於並查集少了很多)

這個就是把模板的max改為min即可,因為ST表在維護最大值和最小值的時候原理是一致的

42 | P1040 加分二叉樹[NOIP2003TG]

P1040 加分二叉樹 [普及+/提高]

這個題是一個長得像樹形DP的區間DP

數據只給出了中序遍歷,因此我們不能確定樹的樣子,再加上我們最后要輸出能夠得到最大加分的樹的先序遍歷,於是我們就着手與在這里設計方程

\(f[i][j].a\) 來表示從編號 i 到 j 這些點形成的最優二叉樹(即分數最大),因為我們還有輸出這棵樹,所以我們在進行狀態轉移的時候還需要記錄剛才那棵樹的根節點,保存到 \(f[i][j].r\)

根據題目加分的原則,我們再枚舉一個區間變量 k 去找這個最大值,我們可以得到下面的狀態轉移方程

\[f[i][j].a=\max(f[i][k-1].a \times f[k+1][j].a + f[k][k].a) \]

根據我們設計的方程,最后再輸出 \(f[1][n].a\) 以及以 \(f[i][n].r\) 為根節點的二叉樹的先序遍歷即可

43 | P1440 求m區間內的最小值

P1440 求m區間內的最小值 [普及/提高-]

這個題一眼單調隊列(滾動數組),就比模板還簡單

但是這題題意不清楚,題目中說到的"求出每一項前的 m 個數到它這個區間內的最小值"中,這個區間是前閉后開的(

PS:最近做了一些模板題,可能會寫個匯總

誰讓今天洛谷給我智推五道板子題呢(笑)

44 | P1638 逛畫展

P1638 逛畫展 [普及/提高-]

簡單來說這也是個單調隊列的題,因為我們只需要保證區間內每個作家有至少一幅畫,所以當一個畫家的畫出現了兩次之時,可以直接讓前面那個出隊,畢竟保留它並不會更優

45 | P1901 發射站

P1901 發射站 [普及/提高-]

總之來說,就還是維護一個單調隊列,保證能量能傳的最遠,所以要保證后入隊的塔比前面的矮

46 | P3146 248 G

P3146 248 G [普及+/提高]

我是真的不敢相信這題是綠的

實際上這道題說起來是要比石子合並簡單的,因 為這題的轉移方程僅僅是f[i][j]=max(f[i][j],f[i][k]+1)

注意在合並的時候要判斷兩者必須相同且均不為 0

47 | P1714 切蛋糕

P1714 切蛋糕 [普及+/提高]

這是我做的第40道綠題!

這道題本質上讓人一眼想暴力,但是50w的范圍很明顯會Time Limit Enough

於是我們就有兩個出路,線段樹(具體我不會搞,kkk說的能搞)或者維護個單調隊列

我這是第一次用STL的deque,大體思路就是滿足條件就進隊(進隊的元素是前綴和),每次和當前ans進行比較,選取大的那個

由於輸入的Pi可能是負數,所以ans最一開始要初始為一個負數(我選的-114514)

最后得到的一定就是最優解了

48 | P6599 異或

P6599 異或 [普及/提高-]

由於我太懶了,建議直接看DX的題解

其實是寫完題之后去整了整AFOed的同學的鏈接,唉......

49 | P4391 Radio Transmission 無線傳輸[BOI2009]

同上,簡單說一下吧,相當於KMP的小擴展形式

50 | P6051 求和

P6051 求和 [普及/提高-]

說實話這題不是很難

如果是經常用快讀的同學們應該知道,快讀的本質就是讀取字符,因為getchar()讀取效率更快一些

而本題就是從字符串中讀取出來數字再進行求和,我這邊直接用快讀讀入的話可以發現它是能讀出來所有數字

於是可以直接從快讀的基礎上進行更改,多維護一個變量來求和即可

51 | P1083 借教室[NOIP2012TG]

P1083 借教室 [普及+/提高]

暴力很好想,直接打就行,就是只有45pts(

正解是差分+二分查找答案

52 | P2420 讓我們異或吧

P2420 讓我們異或吧 [普及/提高-]

這道題稍微一看題解區就會發現什么做法都有

我這里選用的是披着 LCA 名字的 DFS ,因為題目是說兩點之間的路徑上所有邊的邊權的異或值,所以就相當於是這兩點分別到 LCA 的邊權異或值的異或值

由於本題過水,所以我們甚至只需要直接一共 DFS 預處理出每個點的 LCA 以及其對應的異或值即可

53 | P1351 聯合權值[NOIP2014TG]

P1351 聯合權值 [普及+/提高]

我們聯合!

兩面包夾芝士!

這個題首先告訴我們了一個信息:這是一棵樹

再根據題意,兩個能聯合的點之間必然有一個點

於是我們可以枚舉這個中間點,擴展一邊它周圍的邊,就能算出來最大的聯合軍費,一步步枚舉,就可以算出聯合軍費之和

54 | P1613 跑路

P1613 跑路 [普及+/提高]

確實,我要跑路了

這個題很顯然要用到最短路,我們可以這樣想:把能用跑路機的兩個點之間(2n)的邊連為 1 ,接下來就無腦 Floyd

55 | P1168 中位數

P1168 中位數 [普及+/提高]

這道題題意非常易於理解,我第一反應是每次輸入的時候 sort 一下,但是仿佛這復雜度會立即炸掉

於是突然想起 vector 的 insert 的復雜度是 \(O(n)\) 好像能使(

於是就把 upper_bound + insert 合起來用了(

隔壁的 Dfkuaid 默默拿出一手權值線段樹,這玩意效率比 vector 強多了,但是我不會:D

56 | P1853 投資的最大效益

P1853 投資的最大效益 [普及/提高-]

算是復習一下背包,這是一個完全背包

就是多開了一層循環,要遍歷年數

這題最離譜的是給的 \(s \le 10^6\) ,但是數組開 1e6+5 還不夠,需要 1e7 ......

57 | P2918 Buying Hay S

P2918 Buying Hay S [普及/提高-]

這題真是把我整笑了,就一個裸的完全背包

但是因為我賦的初始值不夠大就 WA 了一頁......

58 | P5365 英雄聯盟[SNOI2017]

P5365 英雄聯盟[SNOI2017] [普及+/提高]

簡單來說是一個多重背包,但是我們里要考慮的東西多了不少(

這里的錢的總數需要乘一下

Dfkuaid 是一樣的方程卻下溢出了,咱也不知道為什么我沒有溢出

不過加上防止下溢出的 if 之后,我開 O2 能跑到最優解第一頁了(雖然是最后一個)

59 | P2347 砝♂碼稱重[NOIP1996TG]

P2347 砝♂碼稱重[NOIP1996TG] [普及-]

這題,屑題,不講

60 | P1832 A+B Problem 再升級

P1832 A+B Problem 再升級 [普及-]

這個題先歐拉篩一遍質數然后完全背包

61 | P1244 青蛙過河[NOI2000]

P1244 青蛙過河[NOI2000] [普及-]

這就是2000年的 NOI 的水題嗎

這個題顯然發現有這樣一個柿子: $f[i]=\sum\limits^{i-1}_{j} f[j] $ ,其中 \(f[0]=k+1\)

然而這樣也就告訴我們根本不需要數組 f ,所以我是直接使 k++ 然后乘

這也是我的第 100 道橙題

62 | P2370 yyy2015c01 的 U 盤

P2370 yyy2015c01 的 U 盤 [普及/提高-]

總之來說是 01背包 之前排序一下即可

有了 O2 以及快讀快輸常數小的優勢,拿了第 6 優解

63 | P2904 River Crossing S

P2904 River Crossing S [普及/提高-]

這個題數據一看就非常水吧,就 2.5k 的 n ......

最一開始算一個前綴和 + 完全背包即可

又是由於常數小,拿了第 11 優解,誒嘿

64 | P1631 序列合並

P1631 序列合並 [普及+/提高]
f
這個題,題面確實對我來說有點迷,就是那種,讀懂了但是沒完全讀懂的感覺.....就是,你懂!

強迫文學獎

這個題有一點非常好的就是題目給出的數據已經排好序了,因此我們不必再次排序

由於題目中說到要輸出最小的 N 個,那么很容易想起來要維護一個小根堆,這里我用的 priority_queue ,單純是因為懶,而且太久沒手寫堆了

可以假定這兩個序列選擇時是有先后的,於是我們最一開始讓 a1 + bi 入隊,然后一個個出隊,再把 a2 + bi 入隊,直到到達要求

為了記錄是扔進去的是第幾個 b ,這里在 pq 里用 pair 還存了填入的 b 的編號

65 | P5020 貨幣系統 [NOIP2018TG]

P5020 貨幣系統 [NOIP2018TG] [普及+/提高]

題面可以說是看起來比較難受,這里直接簡述一下

個人理解就是要找一個新的由 m 種貨幣組成的貨幣系統,要保證它和給你的那個貨幣系統是等價的

我看了一眼 Tag 發現是有背包之后 果斷想到這個貌似是完全背包的樣子!

於是就往完全背包上面湊,設了一個 fx 來表示 x 能不能被表示出來,然后顯然在狀態轉移的時候,需要判重,不讓這個 m 在一個價錢上被重復加

狀態轉移方程就是 f[j]=f[j-a[i]];

66 | P6771 Space Elevator 太空電梯

P6771 Space Elevator 太空電梯 [普及/提高-]

這個題顯然是和背包有關,而且是多重背包,這里我采取的狀態轉移方程是 f[x]|=f[x-h[i]]

67 | CF189A Cut Ribbon

CF189A Cut Ribbon [普及/提高-]

顯然這題橙題水准,但是眾所周知 CF 題都是惡評,即使這是 A

就是一個完全背包板子...

所以試圖拿最優解,但是很明顯我不夠格(

68 | CF417A Elimination

寫了題解,希望能通過,畢竟我到現在咕值只有練習分和信用分

題解在這里

(UPD:題解已經過了!)

69 | P1941 飛揚的小鳥 [NOIP2014TG]

P1941 飛揚的小鳥 [NOIP2014TG] [普及+/提高]

哇這題真的是......令人害怕,2014 TG 就這么恐怖,覺得自己 2021 可能要掛(

CSP 2021 & NOIP 2021 RP++ !

這個題細節多的離譜,這也是我做到現在覺得應該放代碼的一道題(雖然已經變成了題解的樣子(

#include <bits/stdc++.h>
#define Heriko return
#define Deltana 0
#define Romano 1
#define S signed
#define U unsigned
#define LL long long
#define R register
#define I inline
#define D double
#define LD long double
#define INF (LLONG_MAX-114)
#define mst(a, b) memset(a, b, sizeof(a))
#define ON std::ios::sync_with_stdio(false)
using namespace std;
I void fr(LL & x)
{
    LL f = 1;
    char c = getchar();
    x = 0;
    while (c < '0' || c > '9') 
    {
        if (c == '-') f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') 
    {
        x = (x << 3) + (x << 1) + c - '0';
        c = getchar();
    }
    x *= f;
}
I void fw(LL x)
{
    if(x<0) putchar('-'),x=-x;
    static LL stak[35];
    LL top=0;
    do
    {
        stak[top++]=x%10;
        x/=10;
    }
    while(x);
    while(top) putchar(stak[--top]+'0');
    putchar('\n');
}
const int MXX=10005;
LL n,m,k,h[MXX],l[MXX],f[MXX][1005],t,fans[MXX],ans,x[MXX],y[MXX];
bool o[MXX];
S main()
{
    fr(n),fr(m),fr(k);
    for(R LL i=0;i<n;++i) fr(x[i]),fr(y[i]);
    for(R LL i=1;i<=k;++i) fr(t),fr(l[t]),fr(h[t]),o[t]=true;
    for(R LL i=0;i<=m;++i) f[0][i]=0;
    for(R LL i=1;i<=n;++i) f[i][0]=INF;
    for(R LL i=1;i<=n;++i)
    {
        fans[i]=INF;
        for(R LL j=1;j<=m;++j) f[i][j]=INF;
        for(R LL j=x[i-1]+1;j<=m;++j) f[i][j]=min(min(f[i-1][j-x[i-1]],f[i][j-x[i-1]])+1,f[i][j]);
        for(R LL j=m-x[i-1];j<=m;++j) f[i][m]=min(f[i][m],min(f[i-1][j],f[i][j])+1);
        for(R LL j=1;j+y[i-1]<=m;++j) f[i][j]=min(f[i-1][j+y[i-1]],f[i][j]);
        if(o[i]){for(R LL j=1;j<=l[i];++j) f[i][j]=INF;for(R LL j=h[i];j<=m;++j) f[i][j]=INF;}
        for(R LL j=1;j<=m;++j) fans[i]=min(f[i][j],fans[i]);
        if(fans[i]==INF)
        {
            ans=0;for(R LL j=1;j<i;++j) if(o[j]) ++ans;
            fw(0);fw(ans);
            Heriko Deltana;
        }
    }
    fw(1);
    fw(fans[n]);
    Heriko Deltana;
}

70 | P2938 Stock Market G

P2938 Stock Market G [普及+/提高]

這個題和之前的一道投資的題(# 56 )基本一致,基本就是完全背包小變形,思路基本一致,可以直接去看那道題

PS:這題最一開始跑出 4.6s 把我嚇着了,然后開 O2 就 722ms ,於是我覺得能卡卡,現在是卡到 609ms 拿到第 12 優解,欸嘿

這貌似是我的第 50 道綠題

71 | P1782 旅行商的背包

P1782 旅行商的背包 [提高+/省選-]

我直接宣布這是我這幾天做過最迷幻的題目

上來一看這顯然是個背包,前 n 個是多重背包,后 m 個是完全背包

前 n 個直接打一個二進制優化,先搞♂一邊 f ,然后直接暴力三層循環求后 m 個

最一開始數組開的 2e4+5 ,有 RE ,本着 RE 我就超級加倍的原則,一直到 6e4+5 和 8e4+5 ,RE 沒了,拿了 80pts

本來想着就直接去看看能不能優化,最后試了一次 1e5+5

欸,就很離譜,過了,然后發現仿佛卡卡 + O2 能進最優解第一頁,然后就卡,最后進去了

別的我不知道,但是為什么同樣是 1.14s ,卻不一樣優?

72 | P1858 多人♂背包

P1858 多人♂背包 [提高+/省選-]

這個題的題面就非常離譜,不光告訴你了這題要算啥,還告訴你這題每個背包要裝滿.....

奇妙的是 memset 只能是 128~4000+ 就非常離譜,我測試了半天都不知道是干啥了

就是在 01背包 的方程上多加了一維變成 \(f[i][j]\) ,第二維代表是第 j 優解,然后因為告訴你要算每個背包裝滿之后的和,因此在轉移的時候就是把 max 改為 sum

提交的時候直接開的 O2 ,直接進最優解第一頁

73 | P1198 最大數[JSOI2008]

P1198 最大數[JSOI2008] [普及/提高-]

這個題有許多的做法,比如 ST表,樹狀數組,線段樹,分塊,單調棧+並查集......

我選擇的是樹狀數組,因為它代碼比較少

寫一個 add 和 query 就行。

I LL query(LL l,LL r)
{
    LL ans=0;
    while(l<=r)
    {
        if(ans<num[r]) ans=num[r];
        for(--r;r>=l+lowbit(r);r-=lowbit(r)) if(ans<tree[r]) ans=tree[r];
    }
    Heriko ans;
}
I void add(LL x)
{
    num[++n1]=(x+t)%mod;
    tree[n1]=max(num[n1],query(n1-lowbit(n1)+1,n1-1));
}

比較惡心的是這題不能用 scanf("%c",&ch); ,用了就 RE 。

74 | P1417 烹調方案

P1417 烹調方案 [普及+/提高]

這個題顯然的是一個 01 背包的問題,但是這里的費用是會隨着時間而改變的,

因此應該比較好想到要先排序一下以保證我們在狀態轉移的時候是最優的。

然后就是自然的 O1 背包。

75 | P1531 I ↑ Hate ↓ It ↑

P1531 I ↑ Hate ↓ It ↑ [普及/提高-]

線段樹,甚至比板子還簡單就非常離譜。練練板子(

76 | P1883 函數 & UVA 1476 Error Curves

P1883 函數 [普及/提高-]

UVA 1476 Error Curves [普及+/提高]

兩個基本一樣的題,評分居然不一樣(

這個寫了題解,鏈接放在這。

在 76 和 77 之間略去了一堆不知道有啥好說的 DS 板子題。

77 | P3870 開關 [TJOI2009]

P3870 開關 [TJOI2009] [普及/提高-]

其實這也是個線段樹的板子,就是想說一點。

這個題每次進行操作的時候相當於是把開着的燈的總數和關着的燈的總數對調了一下。

78 | P1471 方差

P1471 方差 [提高+/省選-]

這個題我摸了一下午......

太累了先題解先摸了。(略略略

79 | P2412 查單詞

P2412 查單詞 [普及/提高-]

我做過最騷的線段樹!

真沒想到還有這種線段樹,開眼了,甚至一個黃題調了一晚上!

大約就是把線段樹里維護的東西變為原字符串和比較字符串(因為題目中說字符串在比較的時候要求不考慮大小寫,所以我們應當將原字符串統一轉為大 / 小寫才能比較)。

不過最離譜的是這個題還卡時間於是我不敢用 string ,於是就用 char 數組,但是 char 數組的比較和賦值不像 string 那么簡單,需要用到 strcmp 和 strcpy ,可把我惡心壞了(

80 | P2434 區間 [SDOI2005]

P2434 區間 [普及/提高-]

差分yyds!

77A | P2574 XOR的藝術

P2574 XOR的藝術 [普及/提高-]

之所以是標的 77A 而不是 81 ,就是因為這個題和 上面的 # 77 是一樣的,就是改了個輸入。

甚至交錯了代碼(

77B | SP7259 LITE - Light Switching

77C | P2846 [USACO08NOV]Light Switching G

77D | P5057 [CQOI2006]簡單題

彳亍! 77 是五倍經驗題!

81 | P1972 HH的項鏈 [SDOI2009]

P1972 HH的項鏈 [SDOI2009] [提高+/省選-]

這道題是非常適合鍛煉樹狀數組的(

首先觀察這個題要進行區間的查詢,然后看到數據范圍是 1e6,於是我就想到了線段樹和樹狀數組。

再因為這個題沒有說到要區間修改,我就直接選擇了碼量比較少的樹狀數組去離線做。

我們考慮,因為是問某個區間內的種類個數,所以我們其實對於一個種類可以只記錄一個特殊的位置,這里參考抄襲大佬們的做法是記錄每個查詢區間最右的每個種類,然后就是正常的樹狀數組。

我們再更新位置的時候,從左向右遍歷。之前若是記錄過位置的,把那個記錄的位置的前綴和 -1,把現在這個枚舉到的位置的前綴和 +1。最后只需再更新位置以及答案。

最后按照詢問的順序進行輸出即可~

UPD 2021.7.8 SP 3267 和這題一樣(

82 | P1966 火柴排隊 [NOIP2013TG]

P1966 火柴排隊 [NOIP2013TG] [提高+/省選-]

這個題思想非常之巧妙,雖然我想了半天沒想出來,爬了就是了。

最一開始搞了個瞎搞的玩意,放在最后說,反正全 WA(

這個題利用了一個很巧妙地東西就是這里樹狀數組維護的是一個“符合數列”的下標,然后求的這個數組的逆序對個數。

這很像很久之前做的某個求最長公共子序列的 DP 題。

下面放一下代碼核心部分,畢竟還是很妙的。。

I bool cmpa(LL x,LL y){Heriko a[x]<a[y];}
I bool cmpb(LL x,LL y){Heriko b[x]<b[y];}

...

S main()
{
    fr(n);
    for(R LL i=1;i<=n;++i) da[i]=db[i]=i;
    for(R LL i=1;i<=n;++i) fr(a[i]);
    for(R LL i=1;i<=n;++i) fr(b[i]);
    sort(da+1,da+1+n,cmpa);sort(db+1,db+1+n,cmpb);
    for(R LL i=1;i<=n;++i) qq[da[i]]=db[i];
    for(R LL i=n;i>=1;--i) ans+=query(qq[i]-1)%mod,modify(qq[i],1);
    fw(ans%mod);
    Heriko Deltana;
}

然后我瞎搞的做法就是類似於湊,算出來兩列對應位置的差,然后依次判斷兩個是否為零,否則就消(

能過樣例就離譜......

既然正確性不對那就不仔細說了~

話說這里破 1k 行了呢(在我習慣性的空行的情況下)。

83 | P4933 大師

P4933 大師 [提高+/省選-]

非常熟悉我的同學應該知道我為什么要做這道題(

因為是等差數列,所以在區間內對公差進行枚舉,每次更新。

不寫更多的說明是因為我太菜了只會看題解不知道該說些啥(

84 | P2303 Longge 的問題

P2303 Longge 的問題 [提高+/省選-]

上來顯然是要煺柿子:

\[\begin{aligned} \sum\limits_{i=1}^n \gcd(i,n) =&\sum\limits_{d|n} d \sum\limits_{i=1}^n [\gcd(i,n)=d] \\ =&\sum\limits_{d|n}d\sum\limits_{i=1}^n [\gcd(i,\frac{n}{d})=1] \\ =&\sum\limits_{d|n}d\varphi(\frac{n}{d}) \end{aligned} \]

然后我們枚舉因數即可。

85 | P4145 上帝造題的七分鍾 2 / 花神游歷各國

P4145 上帝造題的七分鍾 2 / 花神游歷各國 [提高+/省選-]

這個題要區間修改和區間查詢,於是我就寫了個線段樹。

本來是想着能不能煺煺柿子用 LazyTag 去做,但是沒煺出來,於是突然想着能不能暴力去做。一看數據 1e5,於是就直接去用線段樹去維護區間最大值和區間和。

這里維護區間最大值的原因是,題目要求下取整,而我們知道不斷開根的話這個值會趨近於 1,所以當這個區間最大值小於等於 1 的時候我們就不去修改了。

86 | P1382 樓房

P1382 樓房 [提高+/省選-]

這個題算是線段樹的一個變種,這個題可能是子節點運用的最充分的線段樹?

這個題上來需要先對數據進行離散化,然后在修改的時候改為確定單點修改。

現在真的是對我來說藍題就難度上來了

87 | P1438 無聊的數列

P1438 無聊的數列 [提高+/省選-]

這道題無聊,但是不完全有意思。

首先這道題一眼就是樹狀數組或者線段樹,可惜我不會用樹狀數組解決這,就爬線段樹。

看了一眼 Tag 發現這道題有個“差分”,於是就思考怎么把等差數列用差分數組⛏掉。

讓差分數列來簡化在區間 \([l,r]\) 上加等差數列的運算:在 \(a_l\) 上加上首項,\(a_{r+1}\) 上減去末項,中間加上公差即可。

然后就是線段樹板子(

88 | P2257 YY的GCD

P2257 YY的GCD [省選+/NOI-]

這道題事一道要用到莫比烏斯反演的題(

但是我不是很會就只能按照別人煺得柿子來算,還被卡了 long long ......

因為不想再打 \(\LaTeX\) 於是就截圖力(

89 | P2205 [USACO13JAN]Painting the Fence S

P2205 [USACO13JAN]Painting the Fence S [普及+/提高]

掃描線 + 差分,前者用來判斷當前線段是否加到要求的 k 以上,后者是簡化在區間內加同一個數。

但是因為本題的數據范圍不小,因此我們需要離散化,用每次經過的區間的端點來排序。

89A | P2070 刷牆

P2070 刷牆 [提高+/省選-]

我們至今未能知道為什么這道題是藍題而上面那道是綠題。

這個題只需要把上個題要輸入的 k 改為 2 即可。

中間去學了一些平衡樹,於是可能沒太做什么題

90 | P7075 儒略日 [CSP-S2020]

P7075 儒略日 [CSP-S2020] [普及+/提高]

做這道題的緣由有兩個,第一個是想看看去年那個“遠近聞名”的儒略日,第二個是想把這個題當作我 AC 的第 60 道綠題。

不得不說這道題是真的惡心,把這么一個搞人心態題放在 T1......

大約就是使勁分類討論,細節多的離譜......

實際上把分類離清楚了,就很好想了。大約是分成這樣幾類:-4317 年 ~ 1999 年,一共是 2451545 天。

然后是 2000 年及以后的。

需要一個判斷閏年的函數,以及判斷下一天的函數(這個函數中需要考慮很多特判,比如跨公元前后和 1582 年,還有就是閏年,不過想清楚了還是很好打的)

\(\texttt{main}\) 函數里還需要一些玄學操作......

總之這道題在模擬難度上看我覺得至少是個藍,綠有點低。

總之 \(\texttt{CSP2021 and NOIP2021 RP++}\) 罷。

91 | P7076 動物園 [CSP-S2020]

P7076 動物園 [CSP-S2020] [普及+/提高]

感覺這道題才是名副其實的 T1,看起來題面非常的模糊,但是數據范圍里的一個數據保證,就讓人很快樂。

數據保證所有 \(a_i\) 互不相同,所有的 \(q_i\) 互不相同。

因此我們只需要考慮哪些是被要求過一定需要,否則就是一定沒有,然后我們剩下的的部分中選取是 1 的位的個數即可。

因為問的是還能有多少,所以最后顯然答案是 \(\texttt{ans-n}\)

這才是真正的 T1 啊,綠的合情合理,真是為去年把儒略日出在 T1 的人的家人擔憂(

總之 \(\texttt{CSP2021 and NOIP2021 RP++}\) 罷。

92 | P2184 貪婪大陸

P2184 貪婪大陸 [提高+/省選-]

一眼樹狀數組+差分,但是最一開始假了。這樣例也太水了點,最一開始以為直接用樹狀數組維護一個差分數組的前綴和就行,但是沒想到這完全假掉。

但是還好大體的思路仍然是樹狀數組+差分,不過需要一些變通,為我們維護的東西變成了重疊數(也就是區間疊加數),把 \(\texttt{tree}\) 數組再開一維,表示以這個點為開頭(0)還是結尾(1),最后輸出 \(\texttt{Query(r,0)-Query(l-1,1),1}\) 即可。

其實就是建了兩個樹狀數組分別維護區間頭和區間尾。

93 | P5664 Emiya 家今天的飯 [CSP-S2019]

P5664 Emiya 家今天的飯 [CSP-S2019] [提高+/省選-]

這題就離譜!調了一下午!

大約思路就是統計不可行的方案的個數,然后 mod 減一下就是答案。

大約是看了題解里 Akarui 的思路。

94 | P2894 Hotel G [USACO08FEB]

P2894 Hotel G [USACO08FEB] [提高+/省選-]

這道題顯然是線段樹去解,不過在這里要維護的東西很不一樣。

因為是每次要從左端開始找,所以我們維護一個左端最大值,同時我們也要維護一個右端最大值,具體原因下面會說。

同時我們要維護當前有多少房間是有人住的(其實維護沒人住的也行,畢竟區間是給定的),然后要維護一個最大值。

而我們的 Tag 就是表示當前要把這個區間修改為住或不住。

我們考慮到區間的最大值不一定會全部取自左右(這里說的左右是二分后的左右區間,也就是左右兒子),還可能跨過 mid,因此我們在更新最大值的時候,不光要把左右區間(左右兒子的最大值)考慮進來,還要考慮跨過中間的值,也就是這樣:

t[x].val=max(max(t[lc(x)].val,t[rc(x)].val),t[lc(x)].rmx+t[rc(x)].lmx);

95 | P4059 找爸爸

P4059 找爸爸 [提高+/省選-]

寫了題解,在這里

96 | P2341 受歡迎的牛 G [USACO03FALL] [HAOI2006]

P2341 受歡迎的牛 G [USACO03FALL] [HAOI2006] [提高+/省選-]

這題目長度就離譜,這河南這么屑的嗎,06 年省選出個 03 年 USACO 原題

這個題題目看上去就非常顯然,Tarjan 縮點然后判斷每個強連通分量內有幾個結點(奶牛~)

96 | P3718 Alter [AHOI2017]

P3718 Alter [AHOI2017] [普及+/提高]

不知道是 AHOI17 的第幾道題,但是還是蠻水的。

大約經歷就是從騙分到優先隊列到二分正解。

最一開始的騙分因為覺得貪心貪的太拉就寫了一半放棄了,然后就在我那個騙分的基礎上寫了個優先隊列,然后在我交之前居然發現這玩意假了,然后就囸了一下題解寫了個二分。

97 | P1896 互不侵犯 [SCOI2005]

P1896 互不侵犯 [SCOI2005] [提高+/省選-]

算是狀壓的模板題罷,我們考慮用二進制數來表示我們的國王們都放在了哪里。

98 | P2756 飛行員配對方案問題

P2756 飛行員配對方案問題 [提高+/省選-]

顯然是二分圖最大匹配,把外籍的飛行員放在左邊,英籍的放在右邊。

對於左邊的每個點跑一邊匈牙利即可。

99 | P1330 封鎖陽光大學

P1330 封鎖陽光大學 [普及+/提高]

這道題的數據如果是個無向圖可以用二分圖的判定 DFS 來做,但是數據並沒有保證圖是聯通的。

但是我們可以仍然去參考染色的思想,實際上 DFS 根本不用改太多,只不過每次染色的時候加上當前是染了什么顏色即可。

然后每次 ans 加上兩個顏色中比較小的那個即可(因為我們要最少的河蟹)。

100 | P1129 矩陣游戲 [ZJOI2007]

P1129 矩陣游戲 [ZJOI2007] [提高+/省選-]

是一道顯然的二分圖最大匹配!考慮到我們每次能夠調換的是行和列,於是我們在輸入時遇到 1 時就把 i 和 j+n 建邊,然后正常的跑匈牙利,最后判斷一下 ans>=n 是否成立即可。

第 100 道題了!紀念一下:

\[\color{#1E90FF}\texttt{CSP2021 \& NOIP2021 RP++ !} \]

101 | P2740 Drainage Ditches [USACO4.2]

P2740 Drainage Ditches [USACO4.2] [提高+/省選-]

不得不說 USACO 的題在洛谷上的題名都好長......

是一道網絡最大流的板子題,\(\texttt{EK}\)\(\texttt{Dinic}\) 都可以過,數據還賊水......

102 | P1343 地震逃生

P1343 地震逃生 [提高+/省選-]

又是一道網絡最大流的板子題,這個數據范圍也是 \(\texttt{EK}\)\(\texttt{Dinic}\) 都可以過,不過為了保險起見,還是寫了 \(\texttt{Dinic}\)

這個題就一點和 # 101 以及板子不一樣:最后要判斷一下 maxflow 是不是為 \(0\) 來看能不能到達終點。

還有就是為什么不行就要輸出 \(\texttt{Orz Ni Jinan Saint Cow!}\) 啊(

Bing 翻譯過來是 “大麥尼濟南聖牛!”????

難不成是“Orz 您濟南神犇?”

103 | SP300 & UVA1660 Cable TV Network

SP300 Cable TV Network [省選+/NOI-]

UVA1660 Cable TV Network [省選+/NOI-]

\(\texttt{SPOJ}\)\(\texttt{UVA}\) 的重題率是真的高......

直接把我紫題整到 10 AC 祭~

好了不說廢話,我寫的題解放在這里了。

104 | P2055 假期的宿舍 [ZJOI2009]

P2055 假期的宿舍 [ZJOI2009] [提高+/省選-]

顯然是要用到二分圖最大匹配,於是我決定就用匈牙利來做(

這個題麻煩的是有很多的約束條件,不過建模還是比較好想的,左邊為人,右邊是床。

最一開始我在 \(\texttt{match}\) 的時候一次雙向,然后卡 70pts 卡的我很懵。

其實這是不對的啊,這畢竟不是飛行員配對,我們總不能讓床睡在人上罷(

(其實這樣對不對好像也和存圖的方式有關,我直接一個二維數組模擬鄰接表存圖就貌似不行)

105 | P3522 TEM-Temperature [POI2011]

洛谷 | P3522 TEM-Temperature [POI2011] [提高+/省選-]

LOJ | #2164. [POI2011 R2 D2] 氣溫Temperature

(推薦去 LOJ 做,有更好的翻譯和更強的數據)

是單調隊列題(

這個題和普通的單調隊列不一樣的點在於這道題給出的是一個區間,要求你求出最長的不下降天數。

枚舉 i 進隊的時候考慮如下兩點:

  1. 如果第 i 天的最高溫度小於當前隊首的最小溫度,將隊首出隊。

  2. 如果當前隊列中最低溫度最高的天不在隊首,就把他調至隊首(讓隊尾出隊)。

待這兩個條件全部考慮完之后,讓第 i 天進隊。

那么如何計算連續的天數呢(

不知道

最一開始確實是不知道,題解里面說到,在這幾天之前的那一天一定是出隊的,於是連續的天數就是 i-q[hd-1] ,然后每次和 ans 取個 \(\min\)

最一開始不會算連續天數,於是就莽着去搞連續的出入隊關系,最后居然還把樣例搞過了,然后放在 LOJ 上一看,假了......

今天逐漸的開始用起來 LOJ,確實是環境要比洛谷干凈的多,評測機跑的比香港記者還快,於是從這道題開始部分題會加上 LOJ 的題目鏈接,不過還是以洛谷為主。

106 | P3512 PIL-Pilots [POI2010]

洛谷 | P3512 PIL-Pilots [POI2010] [提高+/省選-]

LOJ | [POI2010] 駕駛員 Pilots

還是一道單調隊列(話說為什么學長光扔單調隊列題啊)

因為題目要求是最大值和最小值的差的絕對值不超過 \(k\),於是我們就要去時刻維護區間最大值和最小值,所以我們要用 ST表 單調隊列。

考慮維護兩條單調隊列,一條是最大值的單調隊列,另外一條是最小值的,都是入隊的時候常規的單調隊列判斷。

只不過有一點需要特殊關注:當任意一條隊列中只剩下一個元素的時候,將另外一個隊列的隊首出隊,然后記錄這個剛剛出隊的元素。

107 | P2841 & P1402 & P1231

洛谷 | P2841 Dining G [提高+/省選-]

洛谷 | P1402 酒店之王 [省選+/NOI-]

洛谷 | P1231 教輔的組成 [省選+/NOI-]

都是網絡流水題的樣子,還是三倍經驗的說~

因為每個人(P1402) / 書(P1231) / cow(P2841) 的需求都是兩個,而且只能選一次,於是我們就把 人 / 書 / cow 拆成兩個點,自己連起來,然后再和其要求連接起來。然后經典人連源點,需求連匯點,然后跑 Dinic。

108 | CF438D The Child and Sequence

洛谷 | CF438D The Child and Sequence [提高+/省選-]

話說這題目翻譯過來就是“孩子和序列”

線段樹的裸題,看似區間取模的復雜度難搞而且沒有什么區間性質,但是我們考慮以下兩點:

  1. 如果要計算 x%y\(y>x\),則這次取模操作沒有實質意義。

  2. 當我們進行一定次的取模之后,x 只會是 0 或 1,而上文所述的次數是 \(\log x\) 級別的。

針對第一條,我們維護區間的最大值,在要進行區間取模的時候判斷一下即可,針對第二條,我們能知道區間取模的復雜度約為 \(O(\log x)\),那么總的時間復雜度就是 \(O(n\log n)\) 級別的。

於是就線段樹隨便寫。

109 | P1659 [國家集訓隊]拉拉隊排練

洛谷 | P1659 [國家集訓隊]拉拉隊排練 [提高+/省選-]

是一道用 Manacher 算法的題,相比於板子,我們需要再開一個桶,然后每次 p[i]-1 為奇數的時候往桶里加一次,最后需要這樣處理 ans

    for(R LL i=n;i>=1;--i)
    {
        if(i%2==0) continue;
        tot+=cnt[i];
        if(k>=tot) ans=(ans*FastP(i,tot))%mod,k-=tot;
        else {ans=(ans*FastP(i,k))%mod,k-=tot;break;}
    }
    if(k>0) ans=-1;

因為這道題有一個測試點的 \(k\) 在 1e12 級別,所以要來個快速冪防止炸 longlong

110 | P1345 Telecowmunication[USACO5.4]

洛谷 | P1345 Telecowmunication[USACO5.4] [提高+/省選-]

這道題非常顯然的網絡流,然后我就去莽 Dinic 跑最大流求最小割了,但是興奮的打完 Dinic,開始寫 main 包的時候,發現這道題居然是割點,但是又發現求割邊能過樣例於是就去交了一發,這數據水的,我有 80pts。

於是就懵逼了,於是就看題解,發現是拆點,即為把一個點拆為兩個點,將這兩個點相連,然后刪掉這個點的操作就相當於去掉這兩點之間的邊,於是就轉化為求最小割了(

111 | P1361 小M的作物

洛谷 | P1361 小M的作物 [提高+/省選-]

~~ [數據銷毀] 卡常題~~

本來以為是個挺正常的拆點跑 Dinic,沒想到這題 [數據銷毀] 卡常......

看了討論區發現了一個簡單的優化,好像對於這種類似稠密的圖很有作用,即在 DFS 中加入:

if(!rst) Heriko flow;

112 | P2936 Total Flow S [USACO09JAN]

洛谷 | P2936 Total Flow S [USACO09JAN] [提高+/省選-]

是一道網絡流的板子題,實際上題目中所述的我們可以的對水管的簡化就是變相的簡述了一下我們如何暴力找最大流,也就是說這道題是讓我們求最大流,於是乎我們直接跑一邊 Dinic 即可。

113 | P3931 SAC E#1 - 一道難題 Tree

洛谷 | P3931 SAC E#1 - 一道難題 Tree [提高+/省選-]

大概就是一道網絡流的快樂板子,因為原來的圖是一顆有根樹,所以我們只需要構造一個虛擬匯點就能完成網絡流的建模。

我們只需要把葉結點連向匯點,所以我們在讀入的時候記錄一下每個點的出度,然后循環讓葉結點和匯點連一條 inf 的邊即可。

Dinic 正常跑是 80 ms,開了 02 直接拿最優解。

114 | P1879 Corn Fields G [USACO06NOV]

洛谷 | P1879 Corn Fields G [USACO06NOV] [提高+/省選-]

是一道狀壓 DP,但是我 DP 太爛就完全不會。

記錄了能否被選中,是通過左移右移來實現的(題目要求不能選相鄰的草地,而我們每次考慮一行,於是只需要考慮左移右移)

115 | P4016 負載平衡問題

洛谷 | P4016 負載平衡問題 [提高+/省選-]

顯然這是一個要轉化為費用流的題。

我們考慮這樣建圖:如果當前點的值 a[i] 小於平均值 per,那么我們把這個點和源點連一條容量為 per-a[i] 的邊,費用為 0;反之,若當前點的值 a[i] 大於平均值,那么把這個點和匯點相連,同樣是費用 0,容量改為 a[i]-per

然后因為原本的圖是一個環,還是無向圖,於是我們再把圖上本來就有的邊建好,正邊費用為 1,反邊費用為 -1,正邊容量 inf,反邊容量 0。

實際上還有貪心數學做法,在下面兩道題說。

116 | P2512 & UVA11300

洛谷 | P2512 [HAOI2008] 糖果傳遞 [提高+/省選-]

洛谷 | UVA11300 [提高+/省選-]

本來以為是三倍經驗,沒想到 116 這兩個題比 115 數據范圍大,不能費用流,於是乎就數學貪心做法,代碼也很好懂於是就放在這里罷。(實在是不想打字了ww,取平均數大家應該都會罷)

    fr(n);
    for(R LL i=1;i<=n;++i) fr(a[i]);
    for(R LL i=1;i<=n;++i) per+=a[i];per/=n;
    for(R LL i=1;i<=n;++i) f[i]=f[i-1]-a[i]+per;
    sort(f+1,f+n+1);mid=f[(n+1)>>1];
    for(R LL i=1;i<=n;++i) ans+=Habs(f[i]-mid);
    fw(ans,1);

117 | P2668 斗地主 [NOIP2015 TG]

洛谷 | P2668 斗地主 [NOIP2015 TG] [提高+/省選-]

哪個親(【數據銷毀】)愛(【數據銷毀】)的學長在團隊題單里放的斗地主???????我愛您!!1

這個題思路簡單清晰數據范圍小爆搜可過復雜度優無常數困擾真是一道不可多得的水題呢!!1

啊那她為什么是藍的呢?

因為她是【數據銷毀】的模擬!

思路很簡單,只需要分以下幾種情況,而且貪心的順序我在這里也直接排好,因為這是顯然的:

順子 \(\to\) 四帶 \(\to\) 三帶 \(\to\) 對子、王炸、炸彈、單走一個六

展開就是:

\[\begin{cases} 1.& 順子\begin{cases}1.& 單順 \\ 2.& 雙順 \\ 3.& 三順\end{cases}\\ 2.& 三帶\ \tt{n}\begin{cases}1.& \tt{n=1} \\ 2.& \tt{n=2}\end{cases}\\ 3.& 四帶\ \tt{n}\begin{cases}1.& \tt{n=1} \\ 2.& \tt{n=2} \\ 3.& 四帶兩對\end{cases}\\ 4.& 對子、單走、王炸、炸彈\\ \end{cases} \]

別問我為什么用 \(\LaTeX\),問就是被這題做瘋了。

到這里都很平常對吧,然后我就寫嘛,從四點開始寫。

我在寫之前直接放話,說儒略日比這分支多比這難這怎么是藍的 Julian 是綠的。

四點半寫完第一遍,沒過樣例,感覺可能有些小地方沒寫對,靜態查了一邊錯,覺得自己可能查不太出來,於是就重構了一遍。

重構完大約五點多一點,我想這次可能沒什么問題了吧,於是就跑樣例,然后,又™沒過!

然后就查錯,找不到錯;和題解差錯,找不到錯;和學長的代碼差錯,找不到錯;和學姐的代碼差錯,找不到錯.....

然后簡單重構了一些小地方毫無效果。

然后就生氣了,五點半正好也是該吃飯了,就去吃飯了。

六點回來之后快速和以上三者的代碼又進行了一遍逐行對比之后發現還是查不出來,然后考慮控制變量法進行差錯。

把題解的順子部分復制過來,然后我以為樣例 1 過了,實際上是我用樣例 2 跑出來樣例 1 的結果。

然后我就很開心覺得這題終於能調出來了,然后把順子部分重構。重構着,突然想起來剛才好像我放的樣例 1 的輸入,然后我去試了一下果然 nmd 白高興了......

然后我就想着反正也重構了就繼續重構罷,然后重構完了就去試樣例,發現啊完全就和剛才一樣,艹。

然后就把題解的后半部分復制過來發現還是不對,一氣之下就把 DFS 全都復制過來,然后跑,然后就過了™樣例。

然后我就用手指着兩份代碼進行靜態人眼高端差錯,然后無果。

這個時候 Dfkuaid 建議我去重構,我說重構個卵我重構了 n 遍了。

最后還是去重構了,然后重構完大約七點,不知道為什么就 RE 了,后來調試發現其實是死循環了,然后也不知道是為什么,然后就又一次一一對照靜態差錯,然后我就硬是找不出來。

然后 Dfkuaid 發現我有個循環變量寫串了,然后我就改過來,走樣例,好我過了,然后提交,過了,彳亍,正好七點半。

然后我去看我重構之前的代碼,到現在也不知道是哪錯了,神™題!!1

所以最后得出來的結果就是 OIer 請必備黃帝內經!我現在還感覺想把電腦砸了但是這不是我電腦我不行(話說就算是我的也不行的說)

118 | P2071 座位安排

洛谷 | P2071 座位安排 [提高+/省選-]

是一道顯然的二分圖最大匹配,我用網絡流做的,總的來說體驗不錯,個球。

最一開始的思路是把一排座位拆為兩個點,然后連容量為 1 的邊到匯點,但是發現自己不會對應起來邊了,於是就不拆了,把容量改為 2。

最一開始寫的 ISAP,寫掛了好像,於是就撿起來 Dinic,然后又寫掛了......

最后是發現把所有的 r[i].val 都寫成 r[i].to 了......

119 | P2319 超級英雄 [HNOI2006]

洛谷 | P2319 超級英雄 [HNOI2006] [提高+/省選-]

又是一道顯然的二分圖最大匹配,但是用網絡流不好做,於是就寫個 Hungary ,然后一直過不了樣例,最后發現是寫網絡流寫習慣了建了條反向邊()

120 | P1350 車的放置

洛谷 | P1350 車的放置 [提高+/省選-]

不會,看了題解,爬了。

121 | P1640 連續攻擊游戲 [SCOI2010]

洛谷 | P1640 連續攻擊游戲 [SCOI2010] [提高+/省選-]

實際上這個題拖了好久了才做,今天終於發現原來我之前一直不想做的原因是我讀錯題了.......

實際上這個題非常的簡單,把屬性放左邊,裝備放在右邊跑 Hungary 即可。

但是還有一點就是時間戳優化,memset 太慢。

122 | P2057 善意的投票 [SHOI2007]/冠軍調查 [JLOI2010]

洛谷 | P2057 善意的投票 [SHOI2007]/冠軍調查 [JLOI2010] [提高+/省選-]

一眼最大流最小割,轉化:我們把小朋友們割開跑 Dinic 即可,但是我 Dinic 又寫掛了???

還是挺好吃的ww

123 | P2598 狼和羊的故事 [ZJOI2009]

洛谷 | P2598 狼和羊的故事 [ZJOI2009] [省選+/NOI-]

考慮最小割,我們這樣連邊:狼的領地和源點相連(INF),羊的領地和匯點相連(INF),然后把每個格子和周圍四個格子相連(1)。

實際上這樣建圖的話,我們割掉一條邊就相當於建上籬笆啦~

124 | P2774 方格取數問題

洛谷 | P2774 方格取數問題 [省選+/NOI-]

做了羊和狼的故事之后回來看這個題,發現思想基本一致!

上一題是把羊和狼分類,這次我們把 (i+j)&1 作為條件分類,剩下的和上一道基本一致,只不過在和周圍連邊的時候,邊的容量是這個方格的權值。

然后最后輸出 sum-maxflowsum 是所有方格權值和。

125 | P4001 狼抓兔子 [ICPC-Beijing 2006]

洛谷 | P4001 狼抓兔子 [ICPC-Beijing 2006] [省選+/NOI-]

算是很離譜了啊(

網絡流很好想,可是這題正解貌似不是網絡流的樣子(

但是還是過去了,但是留下了一個疑惑

然后 @Prean 的解答如下:

126 | P2580 於是他錯誤的點名開始了

洛谷 | P2580 於是他錯誤的點名開始了 [普及/提高-]

unordered_map 直接莽過(

AC 400 祭,提交 1.41k,比例大約是 2.83%,下降不少(((

127 | P1251 餐巾計划問題

洛谷 | P1251 餐巾計划問題 [省選+/NOI-]

em,是一個費用流問題,寫一個 SSP 即可,但是今天寫的時候挺玄學的......

建圖如下:

  1. 每天晚上從起點獲得 x 條臟餐巾

  2. 每天白天,向匯點提供 x 條干凈的餐巾,流滿時表示第 i 天的餐巾夠用

  3. 每天晚上可以將臟餐巾留到第二天晚上

  4. 每天晚上可以送去快洗部,在第 i+c 天早上收到餐巾

  5. 每天晚上可以送去慢洗部,在第 i+e 天早上收到餐巾

  6. 每天早上可以購買餐巾

沒錯就是題解的注釋

128 | P2045 方格取數 加 強 版

洛谷 | P2045 方格取數 加 強 版 [省選+/NOI-]

這個數據加強就很有意思了,加強前是最小割最大流,加強之后是最大費用最大流(

既然是最大費用最大流,那么我們就跑一手 SSP(把 SPFA 里面的松弛操作的大於號改為小於號)

把一個格子拆成兩個點,一個出點一個入點,每個入點和它對應的出點都連上兩條邊,一條費用為 \(k-1\),容量為 1,另外一條的容量本身這個格子的權值,費用為 0。

把源點設為 \((1,1)\),匯點設為 \((n,m)\),於是我們就把每個格子和其下方和右方的格子建立聯系,於是就把 \((i,j)\)\((i+1,j),(i,j+1)\) 對應的出點和入點連接起來,容量為 \(k\),費用為 0。

129 | P2153 晨跑 [SDOI2009]

洛谷 | P2153 晨跑 [SDOI2009] [省選+/NOI-]

因為要一個最長的周期和一個最短的里程,所以我們考慮用最小費用最大流,即里程是費用周期是流。

還是拆點,拆成一個入點一個出點,因為每個點只能過一次,所以我們連的邊費用是 0 ,容量為 1.

然后對於題目中給出的每一條邊,我們把其容量設為 1,費用設為邊權,然后跑 SSP。

130 | P3980 志願者招募 [NOI2008]

洛谷 | P3980 志願者招募 [NOI2008] [省選+/NOI-]

最一開始一看就是很明顯的最小費用最大流,但是想了半天建圖,其實志願者之間並不難建邊,但是實在是不知道如何去維護人數限制,甚至還想過去套一個背包,但是想了想這玩意硬轉移的話會爆炸,然后就懵逼。

然后就爬去看題解,不得不說第一篇題解確實分析的很透徹,思路很清晰(雖然他是從暴力到背包到網絡流,而我是網絡流到 網絡流+背包 到懵逼,但是並不影響理解

以下截自 Orion545 的 P3980 題解

此時我們需要想辦法把人數限制放到圖里

我們考慮最大流算法:它會求出最大的流量

那我們既然用一點流量表示一個人,那么為什么我們不把這個“需要用人”的限制,放到另外幾條邊上呢?

我們在點(i,i+1)之間建邊,設流量為-a[i],也就是負的當天需求數,費用自然是零的

然后,令上文中的志願者(si,ti,ci),建邊(si,ti+1),費用ci,流量無限

此時我們相當於是把第i天的決策放到了第i個點和第i+1個點之間的所有邊上(就是把所有點排成一排,這兩個點之間的那一條位置里的所有邊,包括跨過這個區間的志願者邊)

需要志願者?讓它們從志願者邊上流過去,同時讓人數限制邊滿流到-a[i],這樣求一個1-n+1的最大流,流量為0的最小費用就是雇佣人的最小費用了

為了讓這個限制起效,又因為網絡流中流量非負,所以我們建立點SS和TT,連邊(SS,1)(n+1,TT),限制為inf,費用為0

同時,我們把之前的人數限制邊的流量改成(inf-a[i]),這樣最終的SS-TT最大流一定是inf,而且限制依然成立

131 | SP3267 DQUERY - D-query

洛谷 | SP3267 DQUERY - D-query [提高+/省選-]

想見識一下什么是莫隊,於是乎去找個博客學習,然后就跟着那個博客做了這道題(

實際上這個題先是發現和 HH 的項鏈一樣於是就直接先用線段樹雙倍經驗(

先挖個坑,寫博客的時候把這個題當作例題,然后再掛個 Link 在這。

132 | P1903 數顏色 / 維護隊列 [國家集訓隊]

洛谷 | P1903 數顏色 / 維護隊列 [國家集訓隊] [提高+/省選-]

和上面那個題一樣,還是等我寫完博客掛 Link

133 | P1494 小Z的襪子 [國家集訓隊]

洛谷 | P1494 小Z的襪子 [國家集訓隊] [提高+/省選-]

同上,這道也當例題,歡迎去看(

134 | P2709 小B的詢問

洛谷 | P2709 小B的詢問 [提高+/省選-]

同上,這題又雙叒叕是例題(

135 | P3901 數列找不同

洛谷 | P3901 數列找不同 [普及+/提高]

突然發現好久沒做綠導致藍題快趕上綠了(?)於是找了這個題來做其實是搜莫隊標簽發現就這一個紫色以下的我沒做過了

因為這個題是個綠的就不用它當例題了,一看不強制在線直接用莫隊搞一搞(

我們考慮我們讓 \(l\)\(r\) 指針移動的時候如何去記錄這個區間是否所有的數都互不相同。

第一個想法是只考慮本次轉移涉及的那兩個數,但顯然這樣並不能保證之前或之后沒有相同的,Pass 掉。

第二個想法是考慮開一個桶,記錄數的個數,假如超過了 \(1\) 那么顯然這個詢問區間就有相同的數。

但是不知道為啥這個看起來挺正確的我實現掛了。

於是決定把延續第二個想法得出第三個想法:當桶里的數為 \(1\)++cnt,若為 0 就 --cnt,若最后 cnt==q[i].r-q[i].l+1 那么就記錄本次查詢結果為 \(\tt{Yes}\),否則為 \(\tt{No}\)

然后就過了(

136 | P1042 乒乓球 [NOIP2003PJ]

洛谷 | P1042 乒乓球 [NOIP2003PJ] [普及-]

怎么說呢,請了假在家自閉,然后想到 EZEC R10 Div3 A 沒有場切,就覺得自己模擬還是應當練一練,光會那種圖論和數據結構在 T1 上基本毫無作用(

於是可能在家這幾天就多做做模擬。

這個題簡單來看兩種思路,第一種是邊讀邊計算輸出,第二種是先把全部字符串存下來然后判斷輸出。

最一開始寫的第一種,然后寫炸了連個破模擬都能寫炸我屑的離譜,於是就按照第二種,然后判斷錯了了......

總的來說我模擬是真不行,希望今年 CSP 和 NOIP 考場上不要搞離譜的模擬。

137 | P2670 掃雷游戲 [NOIP2015PJ]

洛谷 | P2670 掃雷游戲 [NOIP2015PJ] [入門]

這是這整個雜題集里面第一次出現紅題

甚至這還是我的第 21 道紅題!紅題超過紫題!!!1

但是nmd為什么EZEC R10 A 是個紅題啊,多不給我面子啊(

回歸正題,這道題很顯然了,對於每一個位置掃一遍其上下左右左上左下右上右下即可。

138 | P1563 玩具謎題 [NOIP2016TG]

洛谷 | P1563 玩具謎題 [NOIP2016TG] [普及-]

這個題還是非常迷惑的(

整體思路是好想的,因為這個題數據范圍不大,所以我們直接枚舉一個指針按照指令跳就行。

經過簡單手模可以發現,如果當前玩具的朝向(0 或 1)和當前指令的方向(0 或 1)相同,則把指針向右移動(加),否則向左(減)。

注意模完 \(n\) 可能會出現指針為 0,於是我們最一開始存的時候從 0 開始就好了(

139 | P1328 生活大爆炸版石頭剪刀布 [NOIP2014TG]

洛谷 | P1328 生活大爆炸版石頭剪刀布 [NOIP2014TG] [普及-]

大約也是一道非常簡單的模擬罷,因為空間和時間都非常冗余,所以直接隨便開即可(bushi

cnacnb 來分別記錄當前到沒個人周期的第幾位即可(

140 | P3174 毛毛蟲 [HAOI2009]

洛谷 | P3174 [HAOI2009]毛毛蟲 [提高+/省選-]

大約是一個 SDSC 都沒有寫這個,於是回來之后覺得應當繼續接着寫(

這道題是一個顯然的樹形 DP,不知道出題人在想啥給了個完全木大的 m。

\(f[x]\) 為以 \(x\) 為根的最長鏈,這樣設是因為這個題實際上就是在找最長的鏈。

不過我們要在 DFS 的時候同時維護最長鏈和次長鏈,因為這個題可能會出現毛毛蟲跨過根節點的情況,但是這種情況也可以是看作最多兩條鏈連在一起組成的,於是我們同時維護最長鏈和次長鏈。

141 | P1472 奶牛家譜 Cow Pedigrees [USACO2.3]

洛谷 | P1472 奶牛家譜 Cow Pedigrees [USACO2.3] [提高+/省選-]

嗯,奶牛家譜果然和奶牛沒有一點關系。

142 | P1453 城市環路

洛谷 | P1453 城市環路 [提高+/省選-]

樹形 DP,這道題有一點不太一樣的是,本題給出的圖是一個基環樹。

我們設 \(f[x][0/1]\) 表示以 \(x\) 為根的子樹的最大獨立集,0 和 1 表示選 \(x\) 或不選 \(x\)

143 | P3205 合唱隊 [HNOI2010]

洛谷 | P3205 合唱隊 [HNOI2010] [提高+/省選-]

用了一種類似小學 插空法 的東西。

144 | P5999 kangaroo [CEOI2016]

洛谷 | P5999 kangaroo [CEOI2016] [提高+/省選-]

特判邊界情況。

if(i==s or i==t) f[i][j]=(f[i-1][j]+f[i-1][j-1]+MOD)%MOD;
else f[i][j]=(f[i-1][j-1]*(j-(i>s)-(i>t))+f[i-1][j+1]*j+MOD)%MOD;

145 | P1550 Watering Hole G [USACO08OCT]

洛谷 | P1550 Watering Hole G [USACO08OCT] [普及+/提高]

在普通邊的基礎上我們連 i 和 n+1 (一個虛擬點),權值為費用,代表挖井。

146 | P3535 TOU-Tour de Byteotia [POI2012]

洛谷 | P3535 TOU-Tour de Byteotia [POI2012] [普及+/提高]

並查集判環,這里因為是讓編號小於 k 的結點不在環上,於是我們可以先把大於 k 的並在一起。

然后再統計一下小於等於 k 的即可。

寫了[題解]。

147 | P3916 圖的遍歷

洛谷 | P3916 圖的遍歷 [普及+/提高]

反向建邊 BFS。

148 | P4878 Layout G [USACO05DEC]

洛谷 | P4878 Layout G [USACO05DEC] [普及+/提高]

差分約束的一個相對模板的題(?)

題目要求的距離遠近直接轉換化為不等式建邊即可,但是要主要每兩個牛之間都要建邊。

149 | P3128 Max Flow P [USACO15DEC]

洛谷 | P3128 Max Flow P [USACO15DEC] [普及+/提高]

LCA + 樹上差分,LCA 是倍增做的。

150 | P2158 儀仗隊 [SDOI2008]

洛谷 | P2158 儀仗隊 [SDOI2008] [提高+/省選-]

是一道歐拉函數的板子題的樣子,算是回憶了一下歐拉篩求歐拉函數(

151 | CF1559A Mocha and Math

洛谷 | CF1559A Mocha and Math [暫無評定](預計 [入門]

Codeforces | CF1559A Mocha and Math

送分 A 題就不多說罷……直接暴力 & 就行

昨天晚上本來是想寫個題解,寫完之后手殘按了書簽鏈接……然后就沒再寫,今天回來一看已經 10 篇題解了就懶得寫了。

152 | CF1559D1 Mocha and Diana (Easy Version)

洛谷 | CF1559D1 Mocha and Diana (Easy Version) [暫無評定](預計 [普及/提高-]

Codeforces | CF1559D1 Mocha and Diana (Easy Version)

題目大意是有兩個森林,問你在保證還是兩個森林的情況下還能連多少邊。

這個 EZ Ver 的 \(n \le 1000\),所以直接暴力枚舉即可。

用兩個並查集來分別維護這兩個森林即可。

153 | P1108 低價購買 & P2687

洛谷 | P1108 低價購買 [提高+/省選-]

這個題實際上是兩個 DP 的疊加。

P2687 的鏈接就不放了,反正很好找,兩者題都一樣就是了,后者需要高精。

154 | T189961 [Wdoi R3] 夜雀 dreaming

因為這個比賽的題都還沒入主題庫,於是就先掛這個鏈接,等進了主題庫再改鏈接罷。

洛谷 | T189961 [Wdoi R3] 夜雀 dreaming [暫無評定](預計 [普及+/提高]

這個題是 Wdoi R3 的 A 題,也就是簽到題,但是很可惜的我沒簽上(

簡化版的題意算是很清晰了,因為時間軸的上限是 \(9966^{9966}-1\),所以直接求出所有的時間點的倍數再去判斷是木大的。

於是我們考慮同一個時間會在什么情況下出現兩個不同的菜。因為放入菜的時間都是每個命令時間的倍數,所以我們考慮對於兩個時間點的 \(\operatorname{lcm}\),那么根據題意我們最后選取的 \(\operatorname{lcm}\) 越小越好,於是我們在枚舉之后進行一次排序。(用優先隊列也可以)

因為題目中計算每個時間點所點菜的公式已經給出,於是我們就可以每次取出 \(\operatorname{lcm}\) 后計算對應的兩條命令在這個時間點的菜,若不同那么這個時間點就是答案。

……但是這樣還不對,因為假如相同的話,我們再考慮 \(2 \times \operatorname{lcm}\) 處,如果再相同就真的沒解了。場上我就因為沒考慮另外一種情況而喜提兩個 WA 痛失簽到機會。

感謝 @Fan_Tuan 大佬幫忙糾錯

155 | P4310 絕世好題

洛谷 | P4310 絕世好題 [普及+/提高]

所以絕世好題就是良心 DP(

這個題 \(O(n^2)\) 的 DP 思路很好想:

for(R int i(1);i<=n;++i)
    for(R int j(1);j<i;++j)

        if(a[i]&a[j])
            f[i]=Hmax(f[i],f[j]+1);

即使這個題的數據及其水,這個做法也是不能 AC 噠,只有 90pts (

於是我們考慮優化。在不改變狀態設計的情況下,我們只能着手於內層循環。考慮 \(j\) 時我們發現實際上有很多的狀態都被浪費掉了,她們到達不了更大的答案。

於是我們進行一個最優性剪枝,記錄當前的最大答案。

156 | P1944 最長括號匹配

洛谷 | P1944 最長括號匹配 [普及/提高-]

看起來是一道相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當的 DP (

核心如下:

for(R int i(2);i<=n;++i)
    {
        if(c[i]=='(' or c[i]=='[') continue;
        if((c[i]==')' and c[i-f[i-1]-1]=='(') or (c[i]==']' and c[i-f[i-1]-1]=='[')) f[i]=f[i-1]+f[i-f[i-1]-2]+2;
        if(f[i]>len) len=f[i],pos=i;
    }

len 記錄的是最長的匹配括號序列的長度,pos 則是最后能匹配的位置。

157 | P2340 Cow Exhibition G [USACO03FALL]

洛谷 | P2340 Cow Exhibition G [USACO03FALL] [提高+/省選-]

是一道清新的背包!

如果 iq>=0 那么跑 01 背包,反之跑完全背包。

不過由於可能會出現負數的情況所以我們多用浪費一倍空間去干掉可能出現的負數下標的情況。

158 | T193697 信號塔

洛谷 | T193697 信號塔 [暫無評定](預計 [普及/提高-]

據說是巨大重題來着,雖然我沒做過但也是覺得眼熟,好像來自於某個神必的結論來着(

中午剛到機房比較熱,就先隨便開個題 Cold down,上來一看 D2A 是個交互題我不會(雖然后來看算是幸好沒有做 A),於是去做 D2B。

這題一看就覺得眼熟,感覺是個 x%y==0 之類的結論題,然后看了下樣例只有 12 的倍數輸出了 1,就先交了個 x%12==0 的,全 WA。

然后去手模了一下發現其實是 x%6==0 ,於是交上去得了 10 pts(

於是去看數據范圍,哦原來有負數,最后 20pts 還爆 ull 范圍了,那就先把快讀的判負號去掉拿了 80 pts。

最后看是不是需要高精度啥的,然后發現實際上每一位加起來判斷一下是否為 3 的倍數再看一眼最后一位判斷是不是偶數即可。

然后就交上去過了。

159 | CF1560A Dislike of Threes

洛谷 | CF1560A Dislike of Threes [暫無評定](預計 [入門]

Codeforces | CF1560A Dislike of Threes

題意簡述:輸出第 \(k\) 個個位不為 \(3\) 且不被 \(3\) 整除的數。

思路簡述:A 題還是一個手速題,因為 \(k \le 1000\),所以我們可以直接枚舉 \(i\)

160 | P3868 猜數字 [TJOI2009]

洛谷 | P3868 猜數字 [TJOI2009] [提高+/省選-]

這是一個 CRT 的題,原式可以化為:

\[\begin{cases} n - a_1 &\equiv \pmod {b_1} \\ n - a_2 &\equiv \pmod {b_2} \\ n - a_3 &\equiv \pmod {b_3} \\ n - a_4 &\equiv \pmod {b_4} \\ &\cdots \\ n - a_k &\equiv \pmod {b_k} \\ \end{cases} \]

那這樣就很 CRT 的板子了,但是這題的最后一個點爆 long long 了,於是就寫個烏速乘罷,然而題目的數據中 \(|a_i| \le 10^9\),也就是說會有負數。

所以我們要進行神必的提前取模來干掉負數的情況。

算是題外話,這是第一個在 Manjaro Linux 上做出來的題,同時這個 “簡單記錄.md” 也突破了 2000 行 😄

161 | P1169 棋盤制作 [ZJOI2007]

洛谷 | P1169 棋盤制作 [ZJOI2007] [提高+/省選-]

是一道垂涎垂線法的例題(?)

這道題定義了三個遞推用的二維數組:l,r,u,分別表示從 \((i,j)\) 開始能到達的最遠的左右位置和能向上擴展的最長長度。

if(f[i][j]!=f[i-1][j] and i>=2)
{    
    l[i][j]=Hmax(l[i][j],l[i-1][j]);
    r[i][j]=Hmin(r[i][j],r[i-1][j]);
    u[i][j]=u[i-1][j]+1;
}
int x(r[i][j]-l[i][j]+1);int y(Hmin(x,u[i][j]));
ans[0]=Hmax(ans[0],y*y);ans[1]=Hmax(ans[1],x*u[i][j]);

同時因為本題給出的是一個 01 矩陣,所以在判斷的時候只需要判定兩者不同即可符合條件,進行遞推。

162 | P4147 玉蟾宮

洛谷 | P4147 玉蟾宮 [提高+/省選-]

這還是一道垂線法的題,整體思路和上一題相似,還是定義三個數組來遞推。

從某種意義上來說這道題比上一道題簡單一些。

163 | P2051 中國象棋 [AHOI2009]

洛谷 | P2051 中國象棋 [AHOI2009] [提高+/省選-]

百藍祭。

是一道狀壓 DP,有兩個大類五個情況需要討論:

if(k>=1) f[i][j][k]+=f[i-1][j+1][k-1]*(j+1);
if(j>=1) f[i][j][k]+=f[i-1][j-1][k]*(m-j+1-k);

if(k>=2) f[i][j][k]+=f[i-1][j+2][k-2]*(((j+1)*(j+2))>>1);
if(k>=1) f[i][j][k]+=f[i-1][j][k-1]*j*(m-k+1-j);
if(j>=2) f[i][j][k]+=f[i-1][j-2][k]*C2(m-j+2-k);

164 | P1578 奶牛浴場

洛谷 | P1578 奶牛浴場 [提高+/省選-]

還是垂線法,不過這道題的數據范圍為 $0 \le $ 長,寬 \(\le 30000\),於是我們就不能和玉蟾宮、棋盤制作一樣開二維數組去做了。

同時我們注意到 \(n \le 5000\),說明障礙點相對較少,於是我們可以枚舉障礙點來做。

參考到的題解 @Ofnoname

165 | P2701 Big Barn [USACO5.3]

洛谷 | P2701 Big Barn [普及/提高-]

最一開始以為是跟玉蟾宮一樣的板子,然而我多慮了,其實是更簡單的 DP。

\[f(i,j) = \max \{ f(i-1,j-1),f(i-1,j),f(i,j-1) \} + 1 \]

屬於是 了屬於是。

166 | SP1805 Largest Rectangle in a Histogram

洛谷 | SP1805 HISTOGRA - Largest Rectangle in a Histogram [普及+/提高]

SPOJ | HISTOGRA - Largest Rectangle in a Histogram

在這里我們因為最終極大面積肯定是出於某個位置 \(i\) 的面積 \(i \times h_i\),因此我們需要枚舉 \(i\) 的位置去不斷的向左右擴展。

以向左為例,顯然的是滿足 \(i>1\)\(a_i \le a_{i-1}\) 時,可以繼續向左擴展,即:\(l_i = l_{l_i-1}\)

167 | UVA1619 Feel Good

洛谷 | UVA1619 Feel Good [提高+/省選-]

UVA (Vjudge) | Feel 🤺 Good

和上一題類似的擴展方式,只不過要求一個前🤺綴🤺和🤺。

168 | P2216 理想的正方形 [HAOI2007]

LOJ | #10182.理想的正方形

洛谷 | P2216 理想的正方形 [HAOI2007] [提高+/省選-]

總之很感謝 LOJ 就是了(

這個題我從開題到 AC 的總時間,和斗地主差不多了,都是上午十一點到晚上七點多。

突然想像頭哥一樣怒斥 GP2 Engine:

GP2!GP2 Engine↺Uh!!!↷

當然我之所以這道題從上午十一點開題做到晚上七點多只是因為我菜。

這個題的題意很清晰了,要求能使得其內最大值與最小值之差最小的 \(n \times n\) 的矩形,而因為題目中 \(a,b,n\) 都不變且 \(n\) 比較小,於是我們可以直接考慮去求每個 \(n \times n\) 中的最大值和最小值的差。

我們考慮對於最大值和最小值分別用兩次單調隊列:

  1. 先求出原矩陣中每一行所有長為 \(n\) 的序列內的最大值,得到一個新的矩陣。這一步求出來的是所有 \(1 \times n\) 大小矩陣內元素的最大值。

  2. 將新矩陣的每一列所有長為 \(n\) 的序列內的最大值記錄到一個新的矩陣中。這一步就是所有 \(n \times n\) 大小矩陣內元素的最大值。

  3. 將所有 \(n \times n\) 大小的矩陣最小值按照上面方法求出。

  4. 枚舉元素,找到最小的差。

然后因為某個神必原因調了一下午

最后還是 LOJ 的代碼格式化啟發了我讓我面向題解查錯了一波才找到這個神必錯誤……

169 | P2831 憤怒的小鳥 [NOIP2016TG]

洛谷 | P2216 理想的正方形 [HAOI2007] [提高+/省選-]

Uh Luogu! Luogu Wisdom Engine! Wisdom! Uh!

突然找到了頭哥怒斥 GP2 Engine 的感覺

170 | P2331 最大子矩陣 [SCOI2005]

洛谷 | P2331 最大子矩陣 [SCOI2005] [提高+/省選-]

Uh Luogu! Luogu Wisdom Engine! Wisdom! Uh!又給我推 DP!

算是一道分討類的 DP ?因為 \(1 \le m \le 2\),所以我們可以先考慮 \(m=1\) 的情況再合理推至 \(m=2\)

討論的情況參照的這里

171 | CF1354D Multiset

洛谷 | CF1354D Multiset [提高+/省選-]

CF | CF1534D

一道線段樹?因為是維護了一個桶,所以大約是我寫過最短的線段樹了,本來還想拿這個題來復建線段樹手感呢(

因為覺得全扔進結構體里整潔於是就在其他常數比 Dfkuaid 小的情況下的慢了 \(n\) 秒嚶(

172 | CF1181D Irrigation

洛谷 | CF1181D Irrigation [提高+/省選-]

CF | CF1181D

屬於是陰間題目了屬於是,這題的官方題解不超過 15 行,但是我們自己想的卻是 \(n \times \texttt{std}\) 的權值線段樹和權值樹狀數組(

173 | P2245 星際導航

洛谷 | P2245 星際導航 [省選+/NOI-]

屬於大重題了屬於是,和貨車運輸做法一模一樣(

看着旁邊的 Dfkuaid 因為寫的倍增求 LCA 還要改一些取 \(\min\) 和取 \(\max\) 的地方,我直接宣布雙 set + vector 找 LCA 完全勝利!!!1 (完全不用改

173 | P3959 寶藏 [NOIP2017TG]

洛谷 | P3959 寶藏 [NOIP2017TG] [省選+/NOI-]

這道題的數據范圍看起來就很像是個狀壓 DP,於是我最一開始決定要用大約貪心 + 狀壓來寫。

然而想着想着發現正確性不對,如果要正確性對的話我復雜度就炸到大約 \(n!\) 了(

於是看着扶蘇的題解寫了一個狀壓 DP。

174 | P2602 數字計數 [ZJOI2010]

LOJ | #10169.數字計數

洛谷 | P2602 數字計數 [ZJOI2007] [提高+/省選-]

是一道數位 DP 的板子題,正好遇上洛谷日爆(

采用模板化的 DFS 做法,定義 \(f\) 數組如下 \(f(i,j)\) 表示是從高到低第 \(i\) 位,\(j\) 則是數字出現次數。

DFS 函數為 \(DFS(pos,num,ans,lead,limit)\),參數分別表示:從高到低第幾位,要求哪個數出現的次數,當前出現次數,前導零的狀態,當前位置上限的狀態。

175 | P6218 Round Numbers S [USACO06NOV]

洛谷 | P6218 Round Numbers S [USACO06NOV] [提高+/省選-]

還是數位 DP,因為我在套模板,所以和上一題的區別只有 \(f(i,j)\) 中的 \(j\) 變為了 \(1\)\(0\) 出現次數的差。

對應的,\(DFS\) 中的 \(ans\) 也變成了 \(dlt\)

176 | P4317 花神的數論題

洛谷 | P4317 花神的數論題 [提高+/省選-]

又雙叒是數位 DP,這道題我還是套模板,\(f(i,j)\) 代表第 \(i\) 位的乘積為 \(j\)

因為這道題不需要考慮前導 \(0\),所以 \(DFS\) 函數也變得簡單:\(DFS(pos,st,limit)\)

177 | P4999 煩人的數學作業

洛谷 | P4999 煩人的數學作業 [提高+/省選-]

又雙叒叕是數位 DP,這道題第一次居然讀錯題了認為是求 \([l,r]\) 內所有數的和,我還想這題怎么樣例不對啊(

回歸正題,這仍然能套模板,而且和數字計數很像,但是因為本題要求的東西簡單一些,所以 \(DFS\) 函數中不需要記錄所求數和前導 \(0\) 的問題。

也就是變成了:\(DFS(limit,pos,st)\)

178 | P3413 SAC#1 - 萌數

洛谷 | P3413 SAC#1 - 萌數 [省選+/NOI-]

雖然 De 了很長時間的 Bug,但是總體上這個題的思維難度卻是不高(

難就難在神必字符串,這題不把數據范圍搞到 \(10^{1000}\) 也就是個藍題(

這個題總體上還是相對於前幾個只需要板子的題要難一點的,主要體現在你需要記錄兩個 \(pre\) 以及奇偶不同時的判斷(?)

當然我字符串一塌糊塗於是去看大佬的操作,大佬是先補全的前面那個短的字符串,總之我不是很懂這神必字符串就是了,大佬總能想出巧妙的方法而我只能背模板(

題外話,這個雜題簡單記錄的原 .md 文檔的大小在我打出這個題的標題和鏈接的時候正好達到了 100kB(

179 | P4127 同類分布 [AHOI2009]

洛谷 | P4127 同類分布 [AHOI2009] [省選+/NOI-]

仍然是數位 DP,仍然是能套模板。

暴力枚舉模數!於是我們在 \(f\)\(DFS\) 里面加上一維來表示余數。

180 | P4124 手機號碼 [CQOI2016]

洛谷 | P4124 手機號碼 [CQOI2016] [省選+/NOI-]

數位 DP,這個題相當的良心,可以讓我隨便了開數組去記錄信息,但是 Debug 太久就是我的問題。

看着空間如此寬裕,那么我就開了個 \(f(p1,p2,p3,same,limit,h4,h8)\)\(p1\)\(p3\) 記錄的是這三個連續的數,\(same\) 是標志 \(p1\) 是否滿足連續相同的三個數字,\(limit\) 意義和之前一樣,\(h4,h8\) 表示有沒有出現 \(4\)\(8\)

181 | P2518 計數 [HAOI2010]

洛谷 | P2518 計數 [HAOI2010] [省選+/NOI-]

雖然我是跟着數位 DP 的 Tag 進的這個題,但是看完之后確實覺得組合數學的感覺溢出來了(插入 \(0\),刪除 \(0\),這真的很明顯了屬於是。)

但是我的組合數學過於差了,看完題之后能大約知道是個什么組合意義但是我一個柿子都不會推。

於是去看題解,發現第一篇題解就是組合數學做法,於是就本着體驗懲罰自己太菜用 gedit 寫這個題。

除了沒有括號自動補全不太適應以外感覺比 DevC++ 好用(bushi

182 | P4768 歸程 [NOI2018]

洛谷 | P4768 歸程 [NOI2018] [省選+/NOI-]

LOJ | #2718.「NOI2018」歸程

這個題算是歷史很悠久了,當時 SDSC D1 講了 Kruskal 重構樹,然后《推薦習題》就是這個題,然后 7.16 一下午 + 晚上 + 7.17 下午模擬賽前就光調這個題了,當時搞得心態非常崩潰(

前幾天突然在移動硬盤備份的老移動硬盤的資料里發現了我去年啥都不會的時候在 NOI2020 線上同步賽大的驚天神必暴力,大概復雜度在 \(O(完全算不出來)\) 的級別,然后我想着這玩意交上去怎么着也能過掉 4 pts 左右罷,然后全 TLE,但是我好像跑題了(

於是在那個時候突然想起來我還有一份智熄的歸程沒有寫完,於是就決定 500 AC 祭和百粉祭的時候把這兩個題干掉(

然后沒想到很快就 499 了,於是就在早上的機房打開了我智熄的代碼(

這個題的總體思路是將整個路徑分為兩端:\(n \to u\) 開車,\(u \to 1\) 走路,那么我們就需要枚舉這個斷點 \(u\)

根據題意有水坑的地方是不能走車的,也就是說 \(n \to u\) 這一段都不能有海拔低於水位線,於是我們把海拔按照降序排序。

跑 Dijkstra 后 Kruskal 重構樹,然后每次詢問去找公共祖先即可。

但是這 \(lastans\) 也挺惡心的(

不過上面這些東西我基本上在一個月之前就調的差不多了(除了 \(sum,cnt,tot\) 用混了以外)

然后最后發現是並查集的 \(Find\) 寫智熄了:

int Find(int x)
{
    if(x!=fa[x]) fa[x]=Find(fa[x]);
    Heriko fa[x];
}

183 | P1868 飢餓的奶牛

洛谷 | P1868 飢餓的奶牛 [普及+/提高]

一道線性 DP,方程是 \(f(i)=\max\{f(i),f(v(i,j)+i-v(i,j))\}\)

184 | P1341 無序字母對

洛谷 | P1341 無序字母對 [普及+/提高]

是一道題意很顯然的歐拉路,然而我最易開始一只以為是歐拉回路,然后就很淦的卡了兩個小時(

185 | P6722 「MCOI-01」Village 村庄

洛谷 | P6722 「MCOI-01」Village 村庄 [普及+/提高]

是一道圖論題,因為題意比較清晰,我們可以分為兩部分去求解。

第一部分是把符合條件的新圖建出來,第二部分則是去判斷二分圖。第二部分實現起來很簡單,染色即可,主要是第一部分的實現。

我們考慮如果樹上最長的路徑都 \(\le k\) 的話,那么顯然不存在符合題意的圖。

反之,如果存在二分圖,必然最長路徑的兩端不在一個集合中,也就是說樹的直徑兩端不在一個集合中,因此我們只需要找到直徑的兩端進行兩遍 \(DFS\),最后再進行一次 \(DFS\) 染色判斷即可。

有水題解(

186 | P7113 排水系統 [NOIP2020]

洛谷 | P7113 排水系統 [NOIP2020] [普及+/提高]

NOIP2020 的 T1,現在來看題意確實很清晰的是個拓撲排序,正好 2021.9.1 CCF 宣布 NOI 系列賽事 C++14 和 下划線開頭的函數解禁,所以就直接寫的 __int128

187 | P6560 時光的流逝 [SBCOI2020]

洛谷 | P6560 時光的流逝 [SBCOI2020] [普及+/提高]

比較顯然是一個博弈論 + 拓撲排序的題目,不過實際上不是太難的博弈論,要不然我也想不到。

大體的思路是建反邊,將終點和所有入度為 \(0\) 的點的先手勝負設為 \(-1\),如果一個點能到達一個必敗點,那么是必勝態。

188 | P4513 小白逛公園

洛谷 | P4513 小白逛公園 [提高+/省選-]

實際上這應該是一道挺經典的線段樹 + 最大子端和的題,不過我今天才過,拿來復蘇我的線段樹也是不錯啦。

大約就是單點修改的線段樹,維護分別從左右開始的最大子段和,同時維護一個最大值。

189 | P3177 樹上染色 [HAOI2015]

洛谷 | P3177 樹上染色 [HAOI2015] [提高+/省選-]

一道樹形 DP,題意是讓我們把 \(k\) 個點染成黑色,其余為白色,求滿足兩兩黑點之間距離最長和兩兩白點之間距離最長的染色方案。

因為一條邊只有在兩個同色點之間時才有貢獻,所以一條邊被經過的次數等於邊的兩側同色點個數的乘積,即為:

\[temp = w * (k-w) + (sz(y)-w) * (n-k-sz(y)+w) * r(i).val \]

於是方程即為:

\[f(x,j) = \max \{f(x,j),f(x,j-w)+f(y,w)+temp\} \]

接下來想練一下樹剖。

190 | P2146 軟件包管理器 [NOI2015]

LOJ | #2130.「NOI2015」軟件包管理器

洛谷 | P2146 軟件包管理器 [NOI2015] [提高+/省選-]

上面說過要練一下樹剖,於是就看到了這道題,大體的思路就是安裝狀態為 \(1\),未安裝狀態為 \(0\),算是比較板子的樹剖。

下面寫一點這回和上次 Debug 時出現的智熄操作。

  1. 在 DFS1 中 :if(sz[y]>son[x]) son[x]=y;,應寫為 if(sz[y]>sz[son[x]]) son[x]=y;

  2. 在線段樹 Query 中忘了 Pushdown.

  3. 遍歷邊的時候將 int i(head[x]) 錯寫為 int i(head[i])

  4. 在 QTree 和線段樹 Query 中返回值錯寫為 x,但是應當是 res

  5. 在線段樹 Modify 中忘了 Pushup.

191 | P2619 Tree I [國家集訓隊]

洛谷 | P2619 Tree I [國家集訓隊] [提高+/省選-]

題目的說法很清楚是要求最小生成樹了,但是因為求 MST 的算法都是基於貪心,所以我們不能欽定 \(need\) 條白邊去做。

於是我們就順着貪心的想法去做,二分答案即可。

192 | UVA12888 Count LCM

洛谷 | UVA12888 Count LCM [省選+/NOI-]

UVA | Count LCM

煺柿子題。

\[\begin{aligned} &\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m[[i,j]=i \times j]\\ &\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m[\dfrac{i \times j}{(i,j)}=i \times j]\\ &\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m[(i,j)=1]\\ &\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m\sum\limits_{d|n}\mu(d)\\ &\sum\limits_{d=1}^{\min\{n,m\}}\left\lfloor\dfrac{n}{d}\right\rfloor\left\lfloor\dfrac{m}{d}\right\rfloor \end{aligned} \]

於是用歐拉篩篩一下 \(\mu\) 再整除分塊。

193 | P4981 父子

洛谷 | P4981 父子 [提高+/省選-]

有個東西叫做 \(Prüfer\) 編碼與 \(Cayley\) 公式。

一棵無根樹的 \(Prüfer\) 編碼的值運算如下:

首先定義無根樹中度數為1的節點是葉子節點。

找到編號最小的葉子並刪除,序列中添加與之相連的節點編號,重復執行直到只剩下2個節點。

\(Cayley\) 公式是說,一個完全圖 \(K_n\)\(n^{n-2}\) 棵生成樹,換句話說 \(n\) 個節點的帶標號的無根樹有 \(n^{n-2}\) 個。

在這個題這里我們有 \(n\) 種選根的方法,所以總共是 \(n^{n-1}\) 種方案,快速冪做即可。

194 | P2590 樹的統計 [ZJOI2008]

洛谷 | P2590 樹的統計 [ZJOI2008] [提高+/省選-]

191 到 193 都是在補齊周末測試題的時候隨便做的題,這是回歸之前說要練一練樹剖的初心的題。雖然我補題太慢了這一周又過去了……

這是一道樹剖的入門題,需要支持三個操作:單點修改,求路徑上最大值,求路徑上點權之和。

那么這個顯然就是樹剖來做,簡單寫寫即可。

寫一下這次寫的時候 Debug 出來的智熄操作:

  1. 線段樹所有操作全都忘了 Pushup(x)

  2. 輸入詢問的時候把輸入的種類都搞成 char 了,但是很奇怪的過了樣例……

  3. Query 里面遞歸的時候全寫的 Modify……

  4. 一個 n 個節點的樹我輸入了 n 條邊………

  5. 因為時單點修改,但是我最一開始穿的是原標號而不是新標號……

其實都是在查到第 \(3\) 個錯之前查出來的……

總之就是寫一次漲一次畸形。

195 | P1265 公路修建

洛谷 | P1265 公路修建 [普及+/提高]

是一道比較顯然的最小生成樹,因為這個題主要是圍繞着點來進行計算,所以這里用一下 Prim 算法。

兩點間距離公式非常簡單了,然后就是 Prim 的板子,只不過一些地方要記得開 double.

196 | P1119 災后重建

洛谷 | P1119 災后重建 [提高+/省選-]

一道最短路,主要考察對於 Floyd 算法實現過程理解。Floyd 是基於動態規划,每次找到一個中間點 k 來更新最短路信息,對與這道題來說只有能被選擇的點才能更新其他的點,於是我們在每次詢問時先把能更新的點都更新掉保證最短路。

不知道為什么這個題是藍,感覺黃差不多。

197 | P5658 括號樹 [CSP-S 2019]

LOJ | #3209. 「CSP-S 2019」括號樹

洛谷 | P5658 括號樹 [CSP-S 2019] [普及+/提高]

先考慮括號匹配計數,再考慮如何在樹上解決這個問題。

首先對於單純的括號匹配計數,用一個棧就能解決,但是本題需要統計一個路徑上的括號匹配數。

先考慮鏈的情況,那么我們每次新匹配一個括號,就只需要單純的繼承上一個點的信息即可。

然后考慮樹上的情況。剛才之所以可以直接繼承上一個節點,就是因為每個節點的父節點都是其上一個節點,所以我們在這里直接把繼承的信息來由改為其父節點即可。

這里說兩個 Debug 的時候發現的寫掛點:

  • 卡在 55pts:在 DFSif 中使用了 return.

  • 卡在 88pts:在回溯的時候錯把棧數組寫為了字符數組。

198 | P2742 Fencing the Cows [USACO5.1]

洛谷 | P2742 Fencing the Cows [USACO5.1] [提高+/省選-]

當然,這道題再洛谷上也叫做模板,所以就是板子。

做這道題的緣由是 ZROI CSP D5 T4 用到了凸包,但是我沒學過,於是就學了來這個題練手。

最后選用的 Andrew 算法,第一是這個算法的排序想法簡單,第二是這樣排序常熟更小。

199 | P2116 城牆

洛谷 | P2116 城牆 [省選+/NOI-]

一道凸包的板子題,這道題和上道題的唯一區別就是多了一個 \(L\),但是因為我們要找到最短的,所以顯然當城牆距離 \(=L\) 的時候是最優的,而此時最短距離其實就為直線凸包 + \(pi \times 2 \times L.\)

200 | P1463 反素數 [POI2001 and HAOI2007]

洛谷 | P1463 反素數 [POI2001 and HAOI2007] [提高+/省選-]

算是一道數學題(?)

若設 \(x = \Pi p_i^{k_i}\),則 \(d(x)=\Pi (k_i).\)

那么我們就直接搜索(

因為前 \(12\) 個素數的乘積已經超過了 \(2 \times 10^9\),所以我們只需要前 \(12\) 個素數,這個直接寫出來就行。

同時慶祝一下 \(200\) 題(

201 | P4643 阿狸和桃子的游戲 [國家集訓隊]

洛谷 | P4643 阿狸和桃子的游戲 [國家集訓隊] [省選+/NOI-]

時隔 114514 年的更新

考慮將邊權轉化到點上,無論是阿狸還是桃子同時取到兩點,他們都可以獲得 \(u+v+c\) 的權值;若是分取兩端點,則最終答案可抵消為 \(u-v\) 或者 \(v−u.\)

然后排序即可,因為沒保證輸入的權值是偶數,所以先×2最后再除掉。


免責聲明!

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



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