1. 程式人生 > >NOIP2018 差點退役記

NOIP2018 差點退役記

Day 1 不想說了,反正就是三個水題,直接來講Day 2。

Day 2 一上來,T1做法寫的醜了點,折騰了一會,大概50min的樣子寫完了。

T3一眼DDP……這玩意兒我就寫過一個模板,還只寫過一次。考場上直接來莽風險有點大,又看到這玩意兒部分分還挺多的?就先扔了。

然後就開了這個坑爹的T2。

T2第一眼以為是隻要斜行單調就行了,但是仔細分析了一波,發現這樣的話,\(3 \ 3\) 的樣例就會是 \(2 \times 3 \times 4 \times 3 \times 2 = 144\) ,會錯。

仔細想了想,這東西不僅是要斜行單調,有可能兩條不同的路徑到同一個點的時候,會跑出相同的字典序,然後後面的部分只要能夠跑出不同的字典序,就會出問題。

稍微修了一下鍋,條件變為

  1. 滿足每一個斜行的數字從左下到右上是單調遞減的。
  2. 如果對於某個數字,其左邊的數和上面的數相同,那麼以這個點為左上角,終點為右下角的這個矩形,每個斜行所填的數字強制相同。

直接基於這個東西,強上狀壓DP的話,複雜度是 \(2^mm^2n = 1.63 \times 10^{10}\) ,不太能跑,不過狀態數相對較少,說不定可以試一試。不過這個東西兩頭的時候細節相當噁心,又只能拿到 \(80pts\) ,不大甘心。

想到這裡的時候,T2大概開了 \(40min\) ,個人認為還是比較正常的。

後面的過程,就想得有點多了,整個思路也越來越不正常,最後時間不大夠了,決定寫暴力。如果只寫裸暴力的話未免有點太虧了,想來想去寫了個複雜度大概是 \(m^{n-m} m!^2 \times nm\)

……的暴力,大概就是暴力列舉每個斜行由 \(1\) 變為 \(0\) 的位置,然後再暴力 check 第二個條件是否合法。這玩意兒剪下枝的話,應該還是能跑個 \(8 \ 8\) 的。

然而……整場比賽我可能就敗在這個地方了……

考場上列舉位置的時候,寫了個我可能會後悔很久的錯誤……

inline void dfs(int cur,int tot) {
    if(cur > tot) { Calc();return; }
    For(i,1,min(cur,n + m - cur) + 1) P[cur] = i,dfs(cur + 1,tot),P[cur] = 0;
}

然而這個列舉的上界……我算錯了……

inline void dfs(int cur,int tot) {
    if(cur > tot) { Calc();return; }
    For(i,1,min(min(cur,n + m - cur),n) + 1) P[cur] = i,dfs(cur + 1,tot),P[cur] = 0;
}

只要改一下就行了……

就是這個玩意兒……它能跑對所有 \(|n-m| \le 1\) 的資料。很不幸,所有樣例都是 \(n=m\) 的。

後來拿著這個暴力程式找了 \(min(n,m) = 2\) 的規律,\(min(n,m) = 3\) 的時候發現找不出來了……

又拿這個程式,把 \(8 \ 8\) 以內跑得慢的點打了下表。自認為有 \(65pts\) ,就去 rush T3的暴力了。

T3暴力我直接寫的 \(52pts\) 的,調了好一會,才調對。

考場一出來,FakeBeng說T2他找了 \(65pts\) 的規律,\(\min(n,m) = 3\) 也有規律,說什麼一直乘 \(3\) 就行了。我當時覺得心頭一涼……我還地記得我的程式 \(3 \ 5\) 跑出來是 \(1300\) 左右的一個數字,而他說他裸暴力跑出來是 \(1008\)

中午吃飯的時候,完全沒有心思。一直在想到底哪裡有問題……後來猛然間發現,這個列舉上界似乎是有問題的,只有在 \(|n-m| \le 1\) 的時候才是對的。這樣,因為所有的東西都是拿這個錯誤的暴力跑的,自己的 \(65pts\) 就變成了 \(rand(15,35)pts\) 了。

我回頭仔細想了想,其實如果這個暴力我只要寫對了,所有規律我肯定是能輕鬆找出來的……我的暴力都能跑 \(8 \ 8\) 了,乘 \(3\) 的規律不可能看不出來。

晚上的時候在知乎上看到了 \(Wearry\)\(O(\log n + \log m)\) 的題解……才意識到,自己考場上想的狀壓DP狀態數真的很少,在 \(n > m + 1\) 的時候就只有一種狀態了……也就是說自己再冷靜分析一波,也許可以在考場上直接寫出非打表的正解……即使不寫狀壓DP,也可以通過小範圍的分類討論,直接得到一個式子,式子有點噁心,但也能做。

最後T3因為 long long 的原因掛了一個點。\(100 + 100 + 100 + 100 + 25 + 48 = 473\)

出來的時候 doe 還告訴了我 Day2T3 的非 DDP 的正解,倍增+DP。聽上去會比 DDP 好寫很多,相較於樹剖版的 DDP 也會少一個 \(\log\) ,大致做法和nyg的NOIP模擬題幾乎是一模一樣的。不過她自己也很遺憾沒寫出來。大概一眼看到覺得是 DDP 就不會去想其他做法了吧。

最後這場NOIP以我校全線崩盤而告終。我問了一圈,似乎所有人全都吊死在了這個T2上,也不知道該說什麼好。

不管你怎麼討厭這套題,不管你怎麼討厭這個T2,但這就是你的NOIP分數,實實在在,呈現在你眼前,有些刺眼,卻又無可奈何。

仔細想起來,上一屆NOIP考得似乎也不是太好,但是HNOI的時候,完美翻盤。

所以,HNOI2019?

This will be our story.

PS:原來這個打表找規律……根本就不需要能跑出來 \(8 \ 8\) 的程式啊……技不如人,甘拜下風。