noip2018——題解&總結
好了,所有的希望都破滅了,原來這就是出題人的素質。——一個被欺騙的可憐 $OIer$
遊記
Day 0
啥都沒複習,慌得一批。
打了個自閉模擬賽,第一題輸入寫錯了,第二題推不出來,準備退役,yeah。
下午跟大佬們去聽聽 CXM 的考前叮囑,又給我們講了一遍 $NOILinux$ 的相關操作,尤其是終端編譯(我考試用了嗎?……)我順便記了一波。
然後去借(搶)$LHC$ 的電腦,用他裝的虛擬機器練了一波終端。
虛擬機器真卡,噴。
用了兩遍命令列發現沒啥問題,就放心了。
晚上早早回到家,瞎**複習了一波簡單題,又看了看資料結構模板。誒,越看越虛,我要是連相對簡單的 $Day1$ 都不會做我我就有望退役了。
吃完飯先裝 $NOILinux$。
裝了好長時間(二十分鐘?),發現虛擬機器進不去匯入的 $ubuntu$。
上網查錯誤資訊無果。
我換家裡的臺式電腦,又裝了半天,發現還是進不去?
為啥啊?……
我上 $NOI$ 官網下載 $iso$ 試試。
結果官網下載特別慢,顯示要用 $40$ 多分鐘。
不對啊,我之前從郵箱傳回來的 $iso$ 檔案只要 $10$ 多分鐘啊?
我就大膽猜想是郵箱傳壞了。
於是等官網的 $iso$ 下完了,我再匯入虛擬機器,誒,能用。
然後我就用低端的虛擬機器寫了道聯合權值,練了下對拍等操作,就睡覺去了。
Day 1
早早地起來去北師大附,路上還挺虛的,用手機複習了一遍逛公園那道題用拓撲排序方法怎麼做來著。
到了考場大門,發現我的幾個同學也都剛好到。然後我就 $\%\%\%$ 他們咯。
俗話說“膜高一尺,分高一丈”嘛!向大佬膜拜,分能越膜越高。
進了考場,找到我的位置就坐下啦。
噗……這顯示屏的螢幕解析度不對啊……顯示的東西都是扁扁的,配置真垃圾。
公佈了電腦密碼之後我就找設定,想改螢幕解析度,然後發現這是最高的了,而且只能調三種解析度……另外兩種更可怕……
電腦配置差真的很無語。
$SYF$ 大佬坐在靠窗戶的位置,我望了一下她,繼續 $\%$ 了起來。
考前幾分鐘公佈了試題密碼,只讓看題,不讓寫。
開啟壓縮檔案,我把東西全拖出到主資料夾。
先看了下規則文件,今年開始改規則了,每道題的程式要放在不同的資料夾下,以前就給個考號資料夾,三道題的程式啥的一起放進去就可以了
然後去看題。三道 $1s/512MB$ 的題,突然感覺很虛。
先看 $T1$,好像不太難,掃了一分鐘就看 $T2$ 了。
看完 $T2$ 又虛了,好像沒什麼思路,跟去年的 $D1T1$ 小凱的疑惑 差不多的感覺……
三分鐘之後去看 $T3$,來回看樣例和資料,只能上來就想到二分答案,然後還不會判斷。
涼,看完今天三道題感覺好虛啊,我怎麼什麼都不會。
到點可以寫程式碼了,我先敲了預設源,存到每道題的目錄下。
然後做 $T1$。
然後我發現 $T1$ 暴力好像是 $O(n^2)$ 級別的??
也就是說我連 $T1$ 不會做了?
涼,當時想退役了。
周圍已經響起啪啪的鍵盤聲了,然後我就慌了,趕緊拿筆推樣例。
然後就猜想,是不是可以做個倍增,快速求區間最小值,然後在分治的時候把區間所有數都減掉它。再以這個被減成 $0$ 的最小值為分界,繼續分治,減兩邊的區間?
但是如果一個區間中有多個相同的最小值怎麼辦?也就是說對一個區間同時減去最小值,區間可能被 $0$ 分割成多段而不是兩端。(後來發現這個其實沒影響)
然後我覺得這個做法就涼涼了。(但好像資料太水,依然能 $A$)
然後發現可以反過來做:把相鄰且相同的數的區間記為同一個區間,然後每次找數最大的區間,把它減成與它相鄰的區間中,數最大的那個。
這樣倒是可以,把分治轉成合並,就不用考慮多個數同時被減成 $0$ 那種問題了。
然後碼了一波,發現自己寫區間合併的程式碼能力真差……
合併的時候,只要改被減區間的兩端點的歸屬就可以了。
無腦碼了挺久,大概寫到 $9:20$ 吧。小樣例很快測過了。
然後我沒立刻測大樣例,轉 $T3$ 了。
再次看到 $T3$,回想了一下老師講過的那些 樹上 $dp$ 的特徵,然後注意到這題跟 樹上 $dp$ 的性質很像,對於一個點,賽道要麼經過這個點和它的兩條兒子鏈,要麼經過這個點、它的一條兒子鏈和它的祖先鏈(並且只能向上傳一條)。
那就是貪心了吧?把一個點的所有兒子傳來的鏈長排序,對於每一條兒子鏈,把它刪掉(防止另一條鏈取到它自己),貪心取另一條與它相接的長度大於 二分的答案$mid$ 的一條兒子鏈,再把那條鏈刪掉,記賽道數 $+1$;如果沒有能與它連成合法賽道的另一條兒子鏈,就把它傳給祖先鏈。祖先鏈只能選一條最長的兒子鏈傳上去。
當然特判一下所有長度 $\ge mid$ 的兒子鏈,把它們自組成賽道就行了。
這不是 $dp$ 啊?貪心??
但是又推了一下,好像這麼做就可以了,確實不用 $dp$。
於是我就嘗試了一波,$10$ 幾分鐘後寫完了。當然我比較懶,直接用了一種支援加數、二分查詢(lower_bound)和刪數的 $STL$:$set$(其實不是這個,後面會提到)。
試了一下前兩個小樣例,都過了。此時 $10:10$ 左右,轉戰 $T2$。
一看到 $T2$ 又懵了一下,發現還是不會做。好像很結論啊
於是我手寫了一組小資料($2\space 5\space 7$),發現可以不要 $7$,因為它能被 $2,5$ 表示出來。
這樣答案 $m$ 就是 $2$ 了。答案肯定不會是 $1$,因為這個集合能表示的數的集合是 $2,4,5,6,7,8,9,……$。
那還有 $m=2$ 的方案嗎?經過嘗試發現沒有。
好像不能用 不在原集合的數 表示出等價的貨幣系統啊?
感覺這個結論很顯然,簡單想想大概是因為一個數能表示的集合只與自己等價,再深入證明我當時也不清楚了。
進一步推,也就是說只需要看一下原集合中一個數是否能被原集合中其它一些數表示出來
然後看了一下資料範圍,$T\times n\times a_i=5000w$,且 $a_i$ 是正整數。那就 排序+揹包轉移?
**,感覺 $T2$ 比 $T1$ 還簡單了。
**,感覺剛開考時自己就是個傻逼。
$5$ 分鐘抓緊碼完程式碼。
$10:30$ 的時候三道題就都寫完了。
然而三道題都還沒測大樣例,我就著手先測 $T2$ 大樣例了。
一測,沒過!什麼情況啊?
很快發現揹包轉移寫錯了,能把轉移的 $true$ 重新刷成 $false$。
迅速改了一下就對了。
然後去測 $T1$。
一測就死迴圈了,我瞬間懵了。
看了下優先佇列的判退出是怎麼寫的。
然後發現我又 sb 了:$if(l[u]==1\space \&\&\space r[u]==6)\space break;$
$r[u]$ 應該判等於 $n$,我測第一組樣例的時候直接把樣例的 $n=6$ 寫上去了。
然而改完了還是死迴圈。
為什麼??合併區間有問題嗎?按理說合並區間最多隻要 $n-1$ 次啊,最後就只剩下一個區間 $[1,n]$,然後退出去。
我加了個除錯特判,讓優先佇列跑 $10w$ 次就中途退出輸出累積得答案。
然後驚奇的發現答案對了?!
那為什麼會死迴圈?
這個問題坑了我好久。大戰了好久,才發現原來我沒判區間位於左右邊界的情況。於是區間向下標為 $0$ 的位置及左邊界之外合併,最終合併出的左端點就小於 $1$,然後出不去了。
其實好像預處理也寫的不太對,但這裡不好描述是怎麼改的。
大概 $11:15$ 的時候終於過了 $T1$ 的大樣例。由於程式碼的除錯輸出太多,弄得傷痕累累,我特意重新碼了一下格式。
最後測 $T3$ 的大樣例。
不出所料,又沒過。
但是我盯了半天程式碼沒看出哪裡有問題,好像寫的都沒錯啊?
於是我趕緊yy起了 $hack$ 資料。
然後第二組資料就 $hack$ 掉了:
4 1
1 2 1
2 3 2
2 4 2
答案明顯是 $4$,然後我的程式輸出 $3$。
我就疑惑了,下面兩條邊怎麼沒有合併?
我輸出了一下在 $2$ 號點合併兒子鏈時,記錄鏈長的 $set$ 的大小。
然後發現只有 $1$。
不是插入了兩個 $2$ 嗎?
想了半天,我突然意識到了:$set$ 是不可重集,相同的數只存一個。(這就是之前為什麼說其實不是 $set$)
我趕緊改成 $multiset$,再測大樣例,還行,跟自己想的一樣過了。
再過幾分鐘就 $11:30$ 了吧。
也就是說我可以裝作今天 $AK$ 了?
不過我沒有立刻放鬆,反覆地查檔名、輸入輸出、編譯是否還能過等各種細節,防止又翻車了。(我去年 $D1T2$ 打錯大小寫打錯然後爆零了)
多虧最後 $10$ 分鐘發現並刪除了 $T3$ 一堆除錯用的 $getchar$, 不然我直接交上去就可能 $T$ 了。(不知道為什麼本機測就沒事)
呼,累+虛+緊張。等著收卷吧。
考後發現 $D1T1$ 居然是 $noip2013\space D2T1$ 原題??人名都不改??
而且我還沒複習那道題??
$noip$ 出原題真的沒事嗎,不違反規定嗎,
等等……中國信競規定都是他們出的,他們就算真做的有出入,誰敢管啊
總之 $I'm\space so\space moved$。
回到家之後我就驚奇地發現:只是這樣嗎?
Day1三道原題(或近似)
$Day1$ 就出成這樣?幾乎是三道原題,sdyg去吧。
三年OI一場空,三道原題見祖宗。NOIP=POI*N。
更可笑的是,有人在考前幾天發現某些網站上(如bzoj)的原題被關閉了,然後就猜出了是NOIP原題。
行了,準備禁他們的賽。
出題組疑似在 $2013$ 年洩露 $noip2018$ 的試題,嚴重違反公平競賽原則,也禁賽三年。
對了,驗題組也禁賽三年。