省常高NOIP模擬 指引guide

2021-08-22 19:36:16 字數 1185 閱讀 7609

【分析】

做這題可以參考昨天t2的「荒誕」。直觀上來說我們每個旅者可以備選的出口是從他自己的座標,到右上邊界的乙個矩形。

下圖是神奇的兩個旅者可以選擇的矩形範圍:

同時考慮x、y座標,會顯得很難下手。我們考慮將旅者和出口的座標按x座標排序,再暴力沿x座標從高到低列舉。這時我們就只要考慮出口y座標是否比旅者大就可以了。我們可以使用一種神奇的貪心策略,本著「過了這旅者就會少一人」的糟糕精神,我們每列舉乙個旅者就盡量將他與另乙個出口配對反正後面會有x更小的出口,我才不管,同時為了預留相容性更強的出口,我們每次只找比旅者y座標大的第乙個出口(也就是後繼)。如果沒有後繼,就預設這旅者出不去了。。。

以上的貪心策略應當是對的無法可想了,但我又一下子證不出來了,請各位大佬明鑑。。。

這裡列舉的時候,我們把所有的出口都放在了乙個set容器中,可以方便的完成o(logn)的插入、刪除和查詢後繼。當然以上操作也可以用手打treap代替,反正treap隨便亂寫,常數還小。

不需要考慮離散化。(請看題目範圍)

**如下:

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=1e5+1000;

set s;

set::iterator it;

struct nodea[maxn],b[maxn];

int num,n,ans=0;

void read(int& x)

bool cmp(node x,node y)

void slove()

else

if(b[j].x==k)

}}int main()

省常中模擬 day1

第一題 題目大意 給出n個數的數列,如果相鄰的兩個數加起來是偶數,那麼就可以把這兩個數消掉,求最多能消掉多少數。解題過程 1.先自己手工模擬了幾組資料,發現不管消除的順序如何,最終剩下的是一定的。所以就可以每次任意找兩個奇偶性相同的消掉。於是就想到可以用雙向鍊錶來模擬。2.更好的方法 直接用乙個棧來...

省常中模擬 Test1 Day1

臨洮巨人 排序 題意 在字串中找出 a b c 三個字母出現次數相同的區間個數。初步的解法是字首和,用 a i b i c i 表示在位置 i 之前 包括 i 各有 字母 a b c 多少個,列舉區間的左右端點 l 和r,若a r a l 1 b r b l 1 c r c l 1 則是一組解。o ...

NOIP2020提高B組模擬11 26 卡常題

有乙個二分連通無向圖,x 方點 y 方點均為n個 編號為1 n 這個二分圖比較特殊,每乙個y 方點的度為2,一條黑色邊,一條白色邊。所有黑色邊權值均為a 所有白色邊權值均為b 選擇乙個x 方點,代價為連線的所有邊的權值之和。啟用乙個y 方點,需要選擇至少乙個與之相鄰的x 方點。現在,想啟用每個y 方...