CSP S2020 貪吃蛇 題解

2022-05-27 14:57:10 字數 2561 閱讀 6785

題意分析

給出乙個序列,以權值為第一關鍵字,編號為第二關鍵字單調遞增,每次操作讓最大元素的權值減去最小元素的權值,刪除最小元素,將最大元素插回序列並維護單調性,且每次操作要使當前最大元素操作後不必定被刪除,求最後最少能剩下幾個元素。

思路分析

設原序列為 $\$ 。為了方便表述,本文對序列 $\$ 中的元素的大小比較均指以權值為第一關鍵字,編號為第二關鍵字的比較。顯然,這種比較不會出現相等的情況。其中,$val_i,num_i$ 分別表示元素 $i$ 的權值、編號。

分析後可以發現,操作終止時有兩種情況。第一種就是只剩下乙個元素,這個顯然;第二種是當出現乙個最大元素操作後會成為最小元素時。若這個最大元素成為最小元素後,下乙個操作進行了,把它刪了,那之前那個操作就不會進行;否則下乙個操作就不會進行,同樣終止。

第一種情況很好判斷,主要分析第二種情況。根據上面的分析,只要有乙個最大元素操作後會成為最小元素,操作就會終止。因此,在之前的操作中,最大元素操作後一定不會成為最小元素。

引理一:在出現最大元素操作後成為最小元素之前,操作後的元素存在單調性,即先操作的元素一定大於後操作的元素

簡單證明:

先考慮權值均不等的情況。顯然,設當前序列為 $a_1,a_2,a_3,...,a_,a_n$ ,則有 $val_1val_-val_2$ 。

再考慮權值出現相等的情況。根據題設條件有 $val_1\leq val_2\leq val_3\leq...\leq val_\leq val_n$ 。若兩次操作後的權值是相等的,即 $val_n-val_1=val_-val_2$ ,那麼一定有 $val_1=val_2,val_=val_n$ ,因此有 $num_1

引理二:在出現最大元素操作後成為最小元素之前,一定是原序列 $\$ 從小到大被依次刪除,即被刪去的元素依次為 $a_1,a_2,a_3...$

簡單證明:根據引理一,後操作的元素一定排在先操作的元素後面。因此,對於操作後不是最小元素的元素,下一次操作一定會有乙個元素小於它而排在它後面,因此它一定不會成為最小的元素而被刪除。而操作後的元素不會成為最小元素,因此被刪除的元素一定是沒操作過的元素,即原序列從小到大依次刪除。

根據引理一,我們可以用乙個佇列維護操作後的元素,當前最大的元素就是原序列的最大元素和隊頭元素中更大的,即操作後和沒操作的元素中更大的。

根據引理二,對於第 $i$ 次操作,被刪除的最小元素即為 $a_i$ 。

綜上,我們可以 $o(n)$ 模擬操作,直到出現最大元素操作後成為最小元素或只剩乙個元素為止。

現在的問題是,當出現最大元素操作後會成為最小元素時,這個操作究竟進不進行。

根據上面的分析,若下乙個操作會進行而將它刪除,則這個操作不進行;若不會刪除,則進行。而下乙個操作為什麼不會進行呢?就是因為下乙個操作進行後下下個操作會將它刪除。這樣講可能有點繞。按照原題意,即當前這條最大的蛇預判次大蛇不敢吃它,所以它敢把最小的蛇吃了而成為最小的蛇。

對於最大元素操作成為最小元素後,我們無法直接判斷這個操作是不是一定進行。而當最大元素操作後不成為最小元素時,這個操作一定進行。因此,我們需要知道哪一次操作後最大元素不成為最小元素或只剩下乙個元素,顯然這個操作是一定進行的,即破壞了引理一中提到的單調性。

為什麼單調性會被破壞呢?引理一的前提是最大元素操作後不會成為最小元素,此時被刪除的元素的權值單調不降,因此存在單調性;而出現最大元素操作後成為最小元素後,被刪除的元素的權值的單調性不存在了,因此操作後的元素的單調性也會被破壞。

可以想到模擬接下來的操作,直到出現操作後最大元素不成為最小元素或只剩下乙個元素為止。

顯然,在這些操作中,被刪除的元素一定是上一次操作中的最大元素操作後的元素,可以直接用乙個變數儲存。而因為操作後的元素均為最小,那麼其它元素不受影響,所以最大的元素只要在其它元素中找到最大的即可,具體方法和之前的相同。

在模擬這些操作時統計次數,若在第乙個最大元素操作後成為最小元素的操作後第 $x$ 個操作必定進行,那麼第 $x-1$ 個操作必定不進行,第 $x-2$ 個操作必定進行,以此類推。因此當 $x$ 為偶數時,當前操作進行,答案減 $1$ ;否則當前操作不進行。

綜上,我們找到了一種 $o(n)$ 求解的方案。

具體操作

模擬操作,用乙個佇列維護操作後的元素,當前最大的元素為原序列的最大元素和隊頭元素中更大的,第 $i$ 次操作被刪除的數為 $a_i$ 。當出現當前最大的元素操作後成為最小的元素,即小於 $a_$ 時,進入第 $2$ 步操作;否則在只剩乙個元素時停止模擬。

模擬操作,當前最大元素為原序列的最大元素和隊頭元素中更大的,最小元素即為上一次操作後的元素。當出現當前最大的元素操作後不是最小的元素或只剩兩個元素時停止模擬。

//fj-00445

//noip2020 rp++

#include#include#includeusing namespace std;

const int n=1e6+100,inf=1e9;

struct node

,black=;

node max(node x,node y)

q.push(x);pb++;//維護指標和佇列

}printf("%d\n",n-pb+1);

}return 0;

}

Csp S 2020 T4 貪吃蛇 題解

這道題我調了好久 細節非常多。首先,看完題目後,可以發現這是一道博弈問題。那麼接下來,我們假設最強蛇為 x xx 最弱蛇為 y yy 那麼這裡就有兩個結論 如果 x xx 吃了 y yy 不是最弱的蛇,則 x xx 必吃 y yy 證明 假設當前第二強的蛇為 a aa 第二弱的蛇為 b bb 那麼 ...

CSP S 2020初賽遊記

早上七點起床,初賽就在學校裡面考,先去食堂吃了個早飯,高糖的那種畢竟據說考試前攝入醣類能提高智商 然後去機房溜達了一下,膜拜了眾多大神,就是沒有拜夏農爸爸 然後我那個題就選錯了 看了一會兒之後被叫下去考試,考室裡面有很多小朋友,每乙個看起來都很厲害的亞子,我就有點慌,有要考差的預感。卷子發下來了,看...

CSP S 2020初賽遊記

考試前對自己做了一大堆心理輔導,在群裡面也分享了一些東西,用來釋放自己的壓力 然後就懷著必勝的信念打初賽了,可是迅速就從必勝變成了必敗 那是誰?yzhang 那是誰?pmt 那是誰?duyi 那是誰?b6e0 那是誰?名字真的忘了,反正是去年的js省隊選手 這不炸了呀,怎麼考 旁邊坐著一堆巨佬,我不...