Diary Ⅳ

2019/11/04

1.洛谷P3879 閱讀理解
2.WOJ#1830
3.WOJ#4786 正解
4.1102考試T3【√】

  1. 寫法
  2. 狀態定義

做了一上午水題?

WOJ#2604 軍隊調遣
重載小於符號的時候反了(反正你記不到,每次就試一下)
兩個板子(tarjan+最短路)

WOJ#1436 冰壺遊戲
sb搜索
(可以迭代加深,效率顯然更優)

WOJ#1814 文化之旅
啓發式搜索
用set判斷一下種類是否衝突

WOJ#1692 因子的排列
直接爆搜??(由於要考慮很多細節,就直接貼std了)
統計排列數的時候有個技巧
由於我們是枚舉當前這個質因數選的個數(有種累加的思想)
s2=s2(LDB)(y+i)/i;s2=s2*(LDB)(y+i)/i;
令S2爲上一次的排列數,y爲上一次選擇的質因數的總個數
i從1開始枚舉,表示當前這個質因數選的個數

WOJ#4577 山賊集團
不知道哪裏來的執念,一定不要看題解
以至於到了現在,仍然沒A……
下午再好好想想

剩下這兩週:
1.圖論
2.動態規劃
3.數論
4.字符串
5.以前的考試題
6.雜題
7.NOIp真題

今天下午:
1.1102考試T3【√】+WOJ#4378 【2018提高測試】玩具【×】(晚上問一下lsr)
2.WOJ#4577 山賊集團【√】
3.tarjan複習(起碼兩道題)

WOJ#4577 山賊集團
嗚嗚哇哇┭┮﹏┭┮我以前還做過啊!!
現在自己yy,本來複雜度就是錯的,頂多算個暴力,,,然後暴力也寫掛了嗚嗚嗚嗚嗚
(hou神說我沒學過樹上揹包)
定義f[u][status]f[u][status] 表示在以uu爲根的子樹中,分配status的集團能獲得的最大利益
考慮從子樹轉移來信息,不需要將status代到dfs中去
每次處理的時候就把所有情況處理完
兒子信息根據需要直接調用即可

POJ #3694 Network
找橋,縮點,建樹,LCA,並查集

POJ#2942 knight of the round table
補圖
性質:奇環
不能把割點拎出來然後跑dfs求vdccv-dcc!!!!!!【×】
舉個栗子:
在這裏插入圖片描述
這樣的情況如果dfs,就不能找到中間的那個vdccv-dcc

所以呀,就好好地在tarjan裏面求嘛~

		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
			if(low[y]>=dfn[x]){
				flag++;
				if(rt!=x||flag>1) cut[x]=1;
				int z;num++;
				do{
					z=stk[top];top--;
					dcc[num].push_back(z);
				}while(z!=y);
				dcc[num].push_back(x);//一個割點可以屬於多個v-dcc 
			}
		}
		else low[x]=min(low[x],dfn[y]);


2019/11/05

昨天好廢啊……現在只剩了不到兩週了
姑娘你浪費不起了
一定要專注!
任務:
1.POJ2942【√】
2.仙人掌
3.考試題【√】
4.WOJ4750【√】
5.觀光公交
6.ldx一道
7.總結

今天考試:
T1 85pts
T2 0pts
T3 20pts
Total:105pts
最高:160pts

T1 模擬
好坑啊……對方是負值的時候直接打沒有打他優

T2 MST+組合數
數據範圍,記得開long long
掉了10pts暴力

hxy好強
考場推出正解

我也發現是MST了啊。。只是太菜了沒有和這道題聯繫在一起
當前求出來的MST的邊權和假設爲sum
如果sum>Xsum>X ,顯然無解
如果sum<Xsum<X,我們就假設把當前的最小生成樹的邊都染成同一種顏色,考慮加入一條另外顏色的邊。如果加入新邊後(相當於求次小生成樹)sum==Xsum'==X ,那這條邊是我們可以選的,計入cnt1中。如果sum>Xsum'>X,說明這條邊對答案無影響,計入cnt2中。如果sum<Xsum'<X,那麼當前這條邊必須和最小生成樹染成一種顏色。那麼在這種情況下的答案就是2(2cnt11)2cnt22*(2^{cnt1}-1)*2^{cnt2}
對於sum==Xsum==X 的情況類似討論即可

T3
一眼數位dp
結果人家重點是字符串匹配
KMP自動機上dp

gigo好棒☆( ̄▽ ̄)/$:*
考場推出正解【鼓掌!】
update:被Hack了。複雜度是假的。(不礙事兒,能A就是好算法)

大致理一下這個思路吧(還是很清楚的)
你想啊,給定的長串,如果爲它建一個Trie樹
是問號的地方就相當於有0~9的兒子
那如果(假設我們現在在遍歷Trie樹)我們知道當前這個節點的子樹size(也就是合法方案數),那我們是不是就可以很簡單地處理出第k大了呀
問題轉化到這裏已經解決一大半了
現在考慮如何預處理出當前這個節點的子樹信息
首先:

1.我們該如何確定這個節點?
顯然位於原串的第ii位,這個信息必須要有
但只有這個信息還不夠,假設當前第i位之前有很多 ‘ ? ’
那每一個問號對應走到的節點是不一樣的,再記一個與短串匹配的位數
所以我們用f[i][j]f[i][j]來表示一個節點(不能顯式建樹,5e4個節點,105e4

2.f[i][j]f[i][j]表示a串處理到第i位,匹配了b串的j位,i+1~n合法的填數方案。初值:f[n][m]f[n][m]=1
由於處理第i+1位的時候,j的變化可能不是j+1,這時候我們需要維護一個類似kmp的next數組
定義fail[i][k]fail[i][k]表示當前在第i位,下一位填k的最長公共前後綴
轉移就是:f[i][j]+=f[i+1][fail[j][k]]f[i][j]+=f[i+1][fail[j][k]]
3.處理完這些後我們終於可以開始考慮詢問了。奈何詢問1e5,如果每次都從根節點一直找,那就是nq的了。考慮離線(結果還是會被卡,還是STD的辦法好,倍增來找)


2019/11/06

好多好多天都沒有認真按照計劃來執行了
今天一定不能再被分心了,合理安排計劃!

今天考試
嚴重懷疑我們做的是NOI的題。。L可能爲了不打擊我們的自信心,連成績都沒有發(嚶嚶嚶,菜到真實)
T1:莫比烏斯反演+杜教篩
T2:思維好題
T3:狀壓dp+矩陣快速冪優化

得嘞。。直接棄療

11:40~12:15 昨天的總結【√】
12:15~13:05 喫飯+休息
13:05~13:30 中等的字符串暴力+正解【√】(15:30)
任務:

  • Cf L. Timsort
  • 考試題T2
  • Cf B. Dev, Please Add This!
  • Cf A. Coloring Roads
  • WOJ4799 異或的做法

WOJ#4750 中等的字符串
首先,暴力不會。
將所有的串建在AC自動機上,然後類似樹形dp
f[x][dep]f[x][dep]表示走了dep步,當前在x這個節點所得到的最高得分
記憶化搜索即可

考慮優化
這個範圍1012,一看就不能傻傻地直接走那麼多步
由於我們每次的決策空間是一樣的,我們就可以矩陣快速冪優化了

Cf L. Timsort
細節打掛……果然沒有想清楚的地方,瞞誰都瞞不過數據
一開始就覺得自己末尾那個地方沒有處理清楚(果然,不能輕易放過自己的思維漏洞)
不過整體的思路是自己想出來的還是不錯

WOJ#4799 我的訂書機之戀
妙極了。。只可意會不可言傳


2019/11/07

上午任務

  • Cf B. Dev, Please Add This!
  • Cf A. Coloring Roads
  • WOJ#4799 異或的做法
  • WOJ#1829 聰明的質檢員
  • WOJ#3210 序列生成

WOJ#1829 聰明的質檢員
yeah,開心(*^▽^*)
自己yy出來啦~~
只是。。又和昨天一樣,細節打掛(由於隨着w的增大,答案在遞減,所以最後比較的肯定是ans和ans+1)

Cf B. Dev, Please Add This!
建圖沒有想錯,只是怎樣建圖很關鍵
在這裏插入圖片描述
把兩個’#'中間的部分看做一個分量
那麼對於‘*’來說,至少得有一個分量(橫/縱)被到達   -----限制①
對於任意一個分量,如果Ball不能到達,則一定不能選擇   -----限制②
對於任意兩個分量,如果不能互相到達,則一定不能同時選擇   -----限制③

這些限制,我們該如何建邊呢?其實就是一個2-SAT問題
我們將一個分量看做兩個點(0/1),0表示不能到達,1表示可以到達
那麼限制①,設這兩個分量爲idx1,idx2 。那麼就是(idx1,0)–>(idx2,1)以及(idx2,0)–>(idx1,1)
限制②就是(ball,1)–>(idx,0)(事實上在代碼實現的時候,我們將不能到達的點,(idx1,1)–>(idx1,0))
限制③(idx1,1)–>(idx2,0)以及(idx2,1)–>(idx1,0)

最後Tarjan縮點,如果一個分量的兩個點在同一個聯通塊裏,顯然矛盾

Cf A. Coloring Roads
一些基礎的知識不紮實
樹鏈剖分時由於每次都先搜索重兒子,那麼每條重鏈上的DFS序就是連續的。每條邊的信息都存在這條邊深度較大的兒子上。
這道題據說做法很多
我選了一個看起來比較友好的做法:樹鏈剖分+單調棧。對於每條重鏈維護一個關於DFS序的單調遞減棧從而維護答案,每次暴力修改,均攤分析複雜度是對的【看起來就像一個可愛的暴力】(每個詢問最多被加入一次,刪除一次)

WOJ#3210 序列生成
沒有怎麼理解AC自動機的內涵
實際上,它就是告訴你你的轉移往哪裏去呀
然後就很簡單了
數位dp+AC自動機
(注意前導0!!!)

下午任務
把NOIp真題做完(大部分都是簡單題了)

WOJ#1844 Hankson 的趣味題
自己yy了一個做法,複雜度沒問題
但是沒寫出來???最近代碼能力是怎麼了??
總是想到正解,卻寫不出來
(難道是因爲之前直接粘代碼的報應?oh,我要做好碼奴)

不需要分開存在數組裏,一起分解質因數就好了
不然你要分別存下來,光是memset就把時間卡滿了
對於>50000的質因數特殊判斷一下即可
這個特判不簡單啊……
假設最後剩下了a0,a1,b0,b1a0,a1,b0,b1
首先肯定a0==a1&&b0==b1
如果a0!=b0&&a0 ==1a0!=b0\&\&a0\ ==1 ans<<=1
否則無解

WOJ#1830 觀光公交

引自博客
從部分分推正解

按照我自己yy的dp來說,沒有理解題目要求最優化的到底是什麼
: 是旅客的旅行時間總和最小
但是dp只解決了到達當前這個點的最小時間
而這個貪心就很妙了啊~由於加速器那我們每次選擇能惠及人數最多的加速一定最優(每使用一次加速器,對於乘客而言都只能減少1,所以最大化人數即可)

  • 順序(應該是先取前面的)
  • dp(也可以試着換一種方式定義,最優化總時間)

2019/11/08

今天考試
(心態爆炸??不不不,沒有沒有,我沒有爆炸,只是沒有調整好考試策略,積累一下)
T1 100pts
T2 100pts
T3 0pts

T1 8:00~9:00
樣例有毒吧。。複製出來少最後一位
調死我了……最後過了樣例就沒管了
直接用文件讀入

我好像又是僞算法,,直接找規律??
可以證明我通項公式的正確性
推一波雙胞胎式子(對稱性)
然後等比數列轉化一下

事實上也是很套路的一道題了
由於給定的式子pi=api1+bpi+cpi+1p_i=a*p_{i-1}+b*p_i+c*p_{i+1}
我們一看就長得像遞推的式子,但如果直接這樣看,會發現i與i-1和i+1有關,這怎麼搞……
顯然啊,把i+1挪到一邊
得到cpi+1=(a+c)piapi1c*p_{i+1}=(a+c)*p_i-a*p_{i-1}
這樣的話,要是我們知道p0p0p1p1不就隨便做了嘛
可是我們知道的是p0p_0p2np_{2n}
仔細思考一下,會發現p2=()p1+()p0p2=()*p1+()*p0
然後p0==0所以p2=()p1p2=()*p1
然後就會發現,任意一個pip_i都可以用p1p_1來表示
做完啦

實際上還可以用矩陣快速冪優化一波

T2 9:30~11:30
細節差一點又處理掛,最後一分鐘才找到問題…
讀題啊。。。。
把每個細節記在草稿本上或者Highlight,寫完程序後返過去檢查一下。細節是否處理到位

據說暴力好像均攤複雜度是正確的??

T3 我涼了
根本沒看題

據說也是一道不可做題??
emmm……

任務:

  • 學習每道題的正解
  • 觀光公交dp(無做法)
  • 模擬旅行

WOJ#4490 「GXOI / GZOI2019」旅行者
多源最短路+二進制分組
(mark沒有清空,出現了無數多的錯誤情況。一定要想清楚是否需要清空)

注意:

for(re int i=e[u].size()-1;i>=0;--i)

這樣寫是不對的,因爲STL的size都是存在unsigned 裏的
而unsigned是無符號,如果sze=0,然後一減,就會變成極大值

數組清空!!!

根據需要清空數組。不能每次memset都把定義的所有清空(那複雜度不是卡滿了的O(n)嘛)

memset(dis,127,sizeof(ll)*(n+2));

第一個括號是數據類型,第二個是需要清空的大小

貪婪大陸
T2異或

2019/11/09

今天校慶考試
完全不在狀態。。T2僞算法打掛,然後最尷尬的是分段考慮的情況n200n\le200寫的居然是N200N\le200
話說我還檢查了啊……果然狀態不對的時候強迫自己檢查是沒有任何用處的。。
今天中午的時候和rich浪,沒有睡覺
廢了一下午,我死了
下午回家的時候先睡了一覺,然後吃了個飯
感覺好點了,不容易走神了
理一理任務吧:
今天的T2,T3
貪婪大陸

T1 100pts
T2 20pts
T3 0
Total:120pts
最高:204pts

T1 揹包
T2
假結論就不說了

正解:
從優化n3的暴力開始
其實我們不需要枚舉每一個可能的根節點,只要有一個可能的根節點出現,如果它遞歸下去的子樹不滿足條件,則一定不滿足條件

這是一個結論:題目中給定的序列合法的充要條件是對於任意一個區間,都存在一個數使得這個數與區間其他數的差的絕對值不超過 k。
然後就變成n2
我們如果從 l, r 同時向中間找,也就是第 t 步判斷 l + t 和 r-t 是否是合法的 i,那麼時間複雜度變成了
T(n) = T(k) + T(n k 1) + min{O(k), O(n k)} = O(n log n),

T3
完全不知道如何下手。
考慮現在在每一個交點的地方我們都對向交換,那麼最後得到的順序一定正確,這就是最多的對向交換次數(交點數)
那麼最少的對向交換次數呢?
由於沒有學過羣論,目前還不知道爲什麼是n-置換數

2019/11/10
  1. 昨天考試T3
    寫了好久好久……
    1 . 線段樹區間加居然寫掛了!!!!。兒子節點更新的時候用的是seg[k].tagseg[k].tag,我個zz居然寫的是seg[k].valseg[k].val
    2 . 數組開小
  2. T2的異或
  3. 貪婪大陸
  4. NOip真題
  5. 週末作業
  6. 下週計劃(模板複習計劃)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章