1. 程式人生 > >CS Round#53 C Histogram Partition

CS Round#53 C Histogram Partition

bsp 在一起 can 第一個 升級 color round urn names

題意:給定一個數組A,以及一個初始值全為0的空數組B,每次可以對數組B的任意一個區間內的所有數+x,問至少幾次操作能把B數組變成A數組

NOIP原題(積木大賽)升級版,話說CS怎麽那麽多跟NOIP原題差不多的題目,我上次還看見一道攔截導彈來著。。。

言歸正傳,一開始想貪心,後來發現可以構造出反例,想了一會沒什麽好辦法就去看題解了。題解的解釋非常巧妙,他將序列當作一堆矩形豎直排列在一起,最終答案就是矩形的分割數,如下:

技術分享

看到這裏我似乎也知道該怎麽做了。我們考慮序列一開始只有一個矩形的狀況,加入一個新矩形時,其對答案產生貢獻當且僅當它的高度不等於第一個矩形時。可以發現這個結論可以推廣到N個矩形中,如果新加入矩形的高度在相鄰的不降序列中出現過,那麽它將對答案產生貢獻。於是維護一個單調棧即可。

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200000+10
int n,top=0,ans=0,st[MAXN],vis[MAXN];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        while(st[top]>x)vis[st[top--]]--;
        if(!vis[x])ans++;
        st[++top]=x;
        vis[x]
++; } printf("%d\n",ans); return 0; }

CS Round#53 C Histogram Partition