2019辭舊迎新模擬賽 題解報告

2021-09-10 16:08:35 字數 3516 閱讀 1934

劭星

30分做法:暴力列舉

假定查詢l,r最值

**如下:

for(int i=l;i<=r;i++)

滿分做法:

什麼分塊啊、樹狀陣列啊、線段樹啊……都可以

反正這兒沒有設定太嚴格的空間限制

這裡一定要注意,這裡給出的m是自動修復能力值,

所以你還要自己用n減去m求你最多可以銷毀多少個平台

接下來就要求出最小dfs序了

(當然,你也可以直接在樹上跑,這樣子浪費時間,大概得個50分吧)

接著,把求得的序列對映出來,然後對對映出來的做乙個二分答案

怎麼說呢……就是跳石頭那題差不多吧

ps:原本出題思路:就是想出個dfs序的

但是審題的時候發現滿足遞增序列……woc

於是就可以把最小dfs序替換成快排了的

嚶嚶嚶那些老老實實寫了最小dfs序的同學給你們點讚

我也不知道多少分,反正是暴力的做法;

每次刪除陣列中的前導和字尾的0,然後統計剩下的有多少個0小於等於

下一輪每個數依次減去1

這樣的話,假設最高高度為m,那麼時間複雜度就是o(n*m)了

不用想,還是過不了

100分做法:捨去常數的話是o(n)

對於每乙個水槽的邊,可以說其容積為tag(當前水槽的邊上面有多少單位的水),可以是0

第一步:從左往右掃一遍,找到當前位置左邊最高的水槽的邊

第二步:從右往左掃一遍,找到當前位置右邊最高的水槽的邊

第三步:對於每個位置,在那個位置左右最高的邊之中取最小值

這三步是什麼意思呢?

就是說,乙個區域(通俗直**上去就是「水坑」)能夠裝水,取決於區域兩邊的最高峰

可以自己畫圖理解一下,然後對於這個區域裝的最高(注意是高度)的的高度則取決於最低的那個峰(類似於木桶效應)

第四步:用第三步得到的最小值減去當前位置的高度,就可以得到這個水槽的邊上方有多少個單位體積的水(tag)啦!注意:如果差小於1,就不用累計進答案,continue即可

第五步:累計每個水槽的邊的tag,求出答案

還行吧~

這題也是只有滿分的情況

做法:先將字元做乙個對映,比如說a—1,b—2等等

然後這題就變成一道對數列的處理問題了

這裡參(zhai)照(chao)一下我的blog:

2333,順便幫本蒟蒻推廣一下

解法:這裡還是乙個所謂的數學解法

這裡比較玄學,我盡量講明白吧。

先來看解題步驟,最後再解釋:

拿序列3 4 2 1舉例子

1.從右往左找到第乙個反遞增的數a,將這個數所在的位置(下標)記為pos

在這個例子裡頭,a=3,pos=1

2.從右到左找到比a大的第乙個數b

在這裡,b=4

3.交換a和b

例子中的序列就變成了:4 3 2 1

4.將pos右邊的所有數都翻轉(最後一位變為第一位,倒數第二位變為第二位……)

例子中的序列就變成了4 1 2 3

此時的序列就是所求的解

怎麼樣,玄學吧【笑】

看到這裡,還是請自行思考5~10分鐘

一步一步理解(也可以畫圖,也可以論證,理解就行)

我的理解:

我理解了蠻久,大概也是10min這樣才看懂。

第一步,找到a和pos

我們反過來理解,a是右到左反遞增數,那麼說,從右到左在pos之前的一直都是保持遞增的序列

ps:如果沒找到就直接輸出-1,自己想想為什麼

第二步,找到b

這一步還是要連著第三步一起講

第三步:交換a和b

這一步就是使新得到的序列比原序列大,連第二步來說,就是讓新的到的序列在其他比原序列大的序列中盡可能小,因為b是第乙個比a大的數

第四步:pos後面的翻轉

因為pos後的都是遞增,翻轉後就也是遞增,不過方向不一樣,翻轉後的遞增是使b為關鍵的序列最小

我盡力解釋清楚了

附上每一題std**:

第一題:

#include #include #include using namespace std;

int read()

while(ch>='0' && ch<='9')

return x*f;

}int n,m;

struct nodetree[400000+10];

int ans=-1;

int ans2=1000000000;

void down(int k);

void build(int l,int r,int k)

int m=(l+r)>>1;

build(l,m,2*k);

build(m+1,r,k*2+1);

tree[k].maxx=max(tree[2*k].maxx,tree[2*k+1].maxx);

tree[k].minn=min(tree[2*k].minn,tree[2*k+1].minn);

}void find(int k,int x,int y)

if(tree[k].lazy) down(k);

int mid=(tree[k].l+tree[k].r)>>1;

if(x<=mid) find(2*k,x,y);

if(y>mid) find(2*k+1,x,y);

}void down(int k)

int main()

;bool vis[10001];

vectornod[10001];

int from[10001];

int d[10001],w[10001];

int read()

return x;

}int cnt=1;

void dfs(int now)

else

void doit()

cout《第三題:

#include using namespace std;

int n;

int a[100000001]=;

int read()

while(ch>='0' && ch<='9')

return x*f;

}int main()

maxx=a[n];

int ans=0;

for(int i=n;i>=1;i--)

cout《第四題:

#include #include using namespace std;

int read()

while(ch>='0' && ch<='9')

return x*f;

}int n;

void doit()

int pos;

int aa;

int f=0;

for(int i=m;i>=1;i--)

if(a[i]=1;i--)

if(a[i]>aa)

for(int i=1;i<=pos;i++)

coutcout

辭舊迎新,2015咩咩噠

習慣每年都寫總結,但是今年盡然在年前忘記了。可能是2014年真的太忙了,但是2014年確實太不順利了,希望這是給2015年攢人品。雖然2013年過的渾渾噩噩,好在2014年幡然醒悟。先說上半年吧,也就是研一下學期,經過自己的努力,找了乙份recommendation algorithm相關的實習工作...

辭舊迎新,2008,新的自我!

辭舊迎新,2008,新的自我!2007 離我而去,也伴隨著 18年的讀書生涯 回首研究生這幾年,一直想轉型 想進入乙個高效益高利潤的行業 無線通訊的市場是否會隨著3g和 wimax 的發展而膨脹呢?我相信這是未來新的技術增長點,輝煌是遲早的 這也堅定了我進入無線通訊領域的決心 xx將作為我職業發展的...

辭舊迎新 2023年我來了

2014年已經過去了,回顧過去,看走過來的路,歪歪扭扭,但是總的方向還是向前的。這一年,收穫了寶貝女孩,生命中多了一層意義,感覺有了生命的延續,有了乙份責任。這一年,努力掙扎在未來的惶恐中,公司動盪,很多高層和中層領導離職,新的同事和領導融合,鎮痛一直延續。但是也是這一年,花更多的時間泡在csdn中...