CSP-S2019游記


注: 本文寫於11月17日傍晚。

賽前

瘋狂頹廢。
前一天上午打了一下excrt的板子,看了一下\(O(1)\)快速乘等一些小技巧。
感覺自己一年比一年頹廢……吃棗葯丸
今年高一,不管怎樣心態都和初中時不一樣了吧。初中時打掛了還能慶幸自己年輕,現在打掛可真的就不是鬧着玩了……
看考場,發現和lrh&ll一個考場。我怎么覺得17年的時候我們就一個考場呢(雖然好像不在一個組)
考前繼續立flag,希望不要哭着出考場吧(noip2018&pkuwc2019兩次嘗試失敗)

11.16 (Day 1)

我的Day1體驗和大多數低水平選手基本一致。
順序看題。
8:45左右寫完T1. 一遍過了樣例,但是\(n=64\)莫名會掛。最后把(1llu<<n)-1強行改成llong qwq[N+3]; qwq[1] = 1llu; for(int i=1; i<=N; i++) qwq[i] = (qwq[i-1]<<1)|1;才過。
9:10左右寫完T2. 本來覺得做法很虛容易寫掛,反復檢查了一下,結果一遍過樣例了。又去寫暴力,9:25左右拍上了。
1h切了前兩題,這勢頭不對,難道又是全場ak的day1……我打開了T3
這什么玩意??他說的交換數字結果下面配圖很明顯是在交換編號啊???頓時蒙蔽,舉手提問題目是否有問題,得到了No response的熱情答復。
看了半小時,發現那個圖居然和我的習慣不一樣……那個圈里的數是數字圈外的數是編號……
這時候還有2h, 可是仔細看看這題我怎么一點思路都沒有啊……感覺情況非常的復雜,不是很好處理……
打了個10分暴力,又各花了0.5h想兩種特殊形態的部分分,依然毫無頭緒
什么……別告訴我我2.5h剛一道聯賽題只拿10分……我不接受……我不同意……
時間繼續流逝,我又先后嘗試思考正解、鏈、菊花結果屢屢失敗。
我感覺想吐……
然而靈光並沒有閃現。
day1結束,期望得分\(100+100+10=210\)

出考場之后強忍住沒有掉淚,不過心態也基本崩了……17年和18年我的day1分別是\(230\)\(270\), 今年最多\(210\)了……真的有一種支撐不住的感覺
過了一小時和別人交流了一下,發現qdez基本都\(210\)……只有lky似乎想出了T3的\(O(n^3)\), 結果他寫炸了似乎要爆零,慘慘。
又去群里看了下發現大家都在抱怨T1T2sbT3難……突然感覺心態好了一些呢。
看到知乎上題解發出來了,T3的50其實挺套路的啊……為什么我就沒想到呢
傍晚gd初三巨佬zjr來問我估分,他\(235\), 還說GD全場都超過\(210\)了……我又開始崩了
最后聽說yamf T3都沒得超過10分,rqy&myh AK了,wqy T3沒做出,聽myh說集訓隊有一半人不會T3……那這么說的話這場就沒有什么區分度了,我就當今天什么都沒發生,day2加油。

11.17 (Day 2)

傳說中的有區分度的day2終於來了。
逆序看題。
T3, 怎么又是數據結構,棄棄棄
T2, 看上去像斜率優化?毒瘤,棄棄棄
T1, 計數??怎么現在計數都被放到T1了?沒辦法,剛剛剛
8:40 我終於看懂題了嚶嚶嚶
8:42 第一思路是枚舉做了多少菜,發現不可做
8:46 轉換一下思路發現最多一道菜會違反一半的限制,可以枚舉,然后就相當於這一個比別的都多,dp一下,\(O(mn^3)\),一臉懵逼
8:48 發現我的轉移枚舉選哪個是廢的,\(O(mn^2)\), 應該沒假吧
寫了滾動數組dp, 因為清空問題掛了15min,調過大樣例的時候大概是9:10
計數題……不拍了不拍了不虛,看T2
看到樣例3, 一個\(28\)位數赫然地擺在題面里,出題人你真的不嫌自己毒瘤嗎
冷靜了一下,似乎和斜率優化沒什么關系?有一個顯然的\(O(n^3)\) DP是設\(f[i][j]\)表示當前划的最后一段末尾是\(i\), 前一段末尾是\(j\), 發現轉移可以優化,\(O(n^2)\).
寫完了,我怎么又一遍過樣例了??感覺這次畫風好奇怪啊,代碼難度大幅降低?還是我太菜了想不出代碼難度高的正解?
又想了一會沒想到什么比較好的優化,感覺是個貪心又沒有貪心策略,於是開了T3.
\(40\)分顯然白送,鏈顯然白送,然后呢……完全二叉顯然白送……嗎??我感覺我好像不太會寫啊.jpg
於是先去寫了一個\(O(n^2)\), 又一遍過樣例了,今天這是怎么了……鏈的\(15\)分過會再寫吧
想了一會正解,感覺沒什么思路,只想到了一個求子樹內重心的做法: 重心顯然滿足到所有節點距離和最小。那求距離和是一個dp, 我把dp數組表示成\(at+b\)的形式, \(t\)是樹總大小,然后線段樹維護凸包,就可以輕松應對子樹內了……子樹外……沒啥想法啊……
又看看數據范圍,\(n\le 3\times 10^5,T\le 5\), \(O(n\log n)\)都很難通過,線段樹維護凸包可以去死了……
我是不是要止步\(100+64+55=219\)了?這樣的話我離考過去年還差\(3\)分,不甘心……還有1h40min, 我能怎么辦……
現在我還有兩個選擇,一是想T2正解,二是莽T3的完全二叉樹(因為我自知數據結構水平太低想不到正解)。我決定先想一會T2,然后再去想T3.
打出DP表,發現固定\(i\)在合法的前提下\(f[i][j]\)\(j\)的增加而不升,然后又證了一下感覺挺顯然的,那么其實就是要讓每次划分最短。哦這么顯然的結論我都要打表觀察……我是個弱智么?!
此時我過於激動,想都沒想寫了個\(O(n)\)雙指針找決策點,一發過了前兩個樣例,好,我穩了!測第四個樣例(第三個是高精測不了),比答案大了好多……
難道結論錯了?拿暴力程序跑了下,\(dp\)數組是單調的啊??那是怎么了??哦,決策點顯然不能直接雙指針求……我果然是個弱智
那怎么求啊?似乎只能二分+線段樹\(O(n\log n)\)? 線段樹……我真的能寫出來嗎……
T3還有\(15\)分暴力沒打,T2還生死未卜,看着右下角的時間11:01, 渾身無法阻止地冒着冷汗……
冷靜一下,每次覆蓋,單調棧就行了!可是還有兩個該死的二分去不掉,\(O(n\log n)\), 整理一下思路,開始寫吧……
比我想象中的好寫一些,十幾分鍾寫完了,調了一會發現二分的方向反了,改過來過了所有樣例!
還有30min, T2來不及對拍,快馬加鞭寫了個T3的\(15\)分暴力, 這恐怕是我兩天寫得最不順的一個代碼,掛了好多次……
11:47, 我終於調過了樣例,期望得分\(100+88+55=243\).
最后十幾分鍾覺得對拍意義不如肉眼檢查,於是檢查了十幾分鍾文件名、輸入輸出、數組和空間,T2精打細算開了\(1000 \text{MB}\).
結束的那一刻,我把T2的數組從\(4\times 10^7\)改成了\(10^6\). 我不配寫正解,我不配開大數組……
總期望得分\(100+100+10+100+88+55=453\), 感覺墊底水平……但願別掛……
不過似乎剛好能考過去年……?

考完后直接返回(沒有掉淚,flag成功達成)。途中交流了一下,hyw和nyd怎么都說自己T1不會寫了\(84\)喵喵喵?
hyw貌似考得不是很好,估分\(84+64+55=203\)左右,lky好像也不太好,jxp和zkt估分\(100+64+75=239\), 不知道gmt和yzx怎么樣。(這也許是qdez今年最有競爭力的6個人?)
比我低兩級的巨佬sqy估分\(245\), Orzzzzzz... 我被本省初中生吊打,沒救了……
在gzez一起訓練的scx,lh貌似直接心態崩潰……scx昨天\(210\)大眾分,今天自稱t1沒調出來,寫了個指數級暴力;lh自稱d1t2寫掛……默哀
zjr自稱估分\(219\), 但是我不會忘記他外號“張假瑞”的由來(大霧)
看上去大家得分都不是很高,如果我不掛的話還是有希望的……但願別掛分……

總結與反思

這次也許我最想質問自己的一個問題是,為什么我經過這么長時間的訓練,還想不出Day1T3的50分那種比較套路的東西?
也許我會找出借口: 全SD也沒幾個人想出T3的50分啊。可是,所謂競賽就是要選拔出最尖端的那一撮人對吧。現在搞OI的人越來越多,如同千軍萬馬過獨木橋,如果我永遠抱着別人都不會我也不會的心態,每次都拿大眾分,還有什么勝出的可能?
現在的OI大概已經告別了那個比拼熟練度和穩定度的時代,因為熟練和穩定已經是對一個OIer的基本要求,而非用來區分選手的標准。在這種情況下,假設我連基本的套路都掌握不明白,又沒有過人的天賦來做出神仙題,大概只能成為大佬的炮灰吧。
初二,初三,高一,盡管我自己在不斷進步,卻趕不上時代進步的速度。去年ZR十連測,我的成績最后基本穩定在20名左右。今年ZR十連測,我的成績依然在20名左右(而且失誤掉下去的次數還在增加),永遠成不了最尖端的那一部分,省隊將與我有何緣?
因此希望自己以后做題的過程中一定要多積累一下值得借鑒的思路,並對這些套路有足夠的敏感度。(當然也不能過敏,忽視了反套路思維的訓練)
除此之外,自己的努力程度也明顯不夠。高一的四分之一已經過去,如果再不拼盡全力,明年成了一條命選手,驀然回首發現自己枉度五年光陰,將是何種情境,自己心里清楚就好。

賽后

upd 11.18: 發現day2t2我居然把一個單調的東西放在單調隊列里二分……我是智障

upd 11.18: 在學校上着課,突然腦中如雷擊般閃過一個問題。
我的day1t2。
嗯,我代碼原來是這樣的

const int N = 5e5;
int cnt[N+3];

本機對拍\(10^5\)\(n=500\)的數據沒出現問題,但考試結束前發現cnt數組需要用到負下標,於是改成了:

const int N = 1e6;
int cnt0[N+3]; int *cnt = cnt0+N;

更致命的是,我改完之后連測都沒有測直接交了上去。
附正確寫法:
(1)

const int N = 5e5;
int cnt0[(N<<1)+3]; int *cnt = cnt0+N;

(2)

const int N = 1e6;
int cnt[N+3]; //因為n<=5e5, 因此負下標會爆到前一個數組的后半部分,不產生任何影響

多少條正確的道路,我卻偏偏走上了錯誤的一條。
吊 死 於 括 號 樹 上
預估分\(100+0+10+100+88+55=353\)
高一容不下失誤,一招不慎滿盤皆輸……

upd 11.20:
經過數個晝不醒夜不寐的日夜,代碼終於發了。

lky和hyw堅持認為我不可能開錯day1t2的數組,要先測我的day1t2。我拒絕了。

也許這種考驗人心臟的事情,還是獨自進行比較合適。

先測了一發day1t1,\(100\)分過了。

手開始哆嗦。

我的記憶有99%的概率是准的。那1%的“偏差”,若有若無,卻是唯一的希望。

我想象着看到某個場景時的如釋重負,然而腦海里卻充斥着看到另一個場景時的絕望與無助。

也許我可以先測完別的題再來測這題?

算了算了,別的題再有掛的更難受。

鼠標移向那個文件

……

突然傳來hyw的聲音:“你沒寫錯,你寫的是N<<1

我想起前一天lky戲弄我,一本正經地說代碼已經發了,我寫的是N=1e6,cnt[N>>1],害得我半信半疑地問了半天才確定他在騙我。然而這在我看來只是不屑的嘲笑。

“草,你怎么也像lky一樣假我啊”

“不,真的……” 然后我跑到她電腦前,看到了那段晝思夜想的代碼:

const int N = 5e5;
int cnt0[(N<<1)+3]; int *cnt = cnt0+N;

那一刻的感覺無法描述。

松了一大口氣之后,我把剩下四道題一起交了上去。
\(10\)
\(100\)
\(64\)?!
\(55\)

看到\(64\)的時候,我還有些許不相信,后面的點答案都是\(0\)使我更加疑惑。也許是我交的時候搞錯了什么?
重交一發。依然是\(64\)

什么?如果單純是WA了我還可以接受,但是我輸出的都是\(0\),這怎么可能?我在考場上用\(88\)分的代碼過了大樣例的!
INF設小了?不對,答案還不到\(10^{18}\)

代碼:

int n,typ;
llong a[N+3];
namespace BruteForce //64分代碼
{
	void solve()
	{
		for(int i=1; i<=n; i++) scanf("%lld",&a[i]),s[i] = s[i-1]+a[i];
                ......
	}
}
namespace GG //88分代碼
{
	void gen()
	{
                //讀入typ=1的數據
	}
	void solve()
	{
		if(typ==1) {gen();}
                ......
	}
}
int main()
{
        //freopen
	if(typ==0) {for(int i=1; i<=n; i++) scanf("%lld",&a[i]);}
	scanf("%d%d",&n,&typ);
	if(n<=5000) {BruteForce::solve();}
	else {GG::solve();}
	return 0;
}

初始\(typ=0,n=0\), 所以並沒有讀入a數組,但BruteForce中有讀入a[i],GG中沒有!
真相大白:在用\(88\)分代碼過了大樣例后,我決定把a數組的讀入放到main函數中。但是腦子突然短路,我把讀入a數組放到了讀入n的前面,並且忘記從暴力中刪掉這一行,於是我的代碼長成了這樣。
然后,重新測大樣例,順利通過,比賽結束,匆匆離場。
我本來只能通過這題\(88\)證明自己不是個什么都不會的暴力選手,結果它掛成了標准的暴力分。
最悲哀的是,我沒有寫掛代碼,而是在數據分治這種地方陰溝翻船。
改了一發讀入,\(88\)
可喜可賀可喜可賀……

\(100+100+10+100+64+55=429\),這個結果基本是板上釘釘的事了。

得到這個結果,不知道該說什么,是幸運?還是不幸?……

終究難逃考不過去年的命運,盡管由於題目難度天差地別,我的排名還不到去年的三分之一。

如果我day1t2真的開錯了數組……會怎樣呢?
更有甚者,如果我day1考完后意識到這點,day2會考出怎樣的成績呢?是否會在考場外大哭一場,重演NOIP2018的悲劇?
另一方面,如果我day2t2沒寫掛數據分治,穩穩拿到了\(453\)分,又會是怎樣的一種爽快呢?
虛無。現實或好或壞,畢竟是現實。思考那些並沒有什么意義。

靈光閃現的一刻,11:01的電腦時鍾,渾身不停地往外冒的冷汗,寫代碼時的緊張與焦急,過掉大樣例時的如釋重負……
等於什么?等於如釋重負后的腦袋一熱,兩行錯了位置的代碼,和一行忘記刪除的代碼。
聽起來有些搞笑……

總結中多出輕描淡寫的一句話:離場前一定好好檢查數據分治和讀入輸出,最好用每檔部分分把大樣例過一遍。
僅此而已。CSP2019完結。


免責聲明!

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



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