CS Round#53 C Histogram Partition
阿新 • • 發佈:2017-10-19
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