NOIP2013提高組 花匠

2021-07-10 20:11:07 字數 1298 閱讀 2548

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。

具體而言,棟棟的花的高度可以看成一列整數h_1, h_2, … , h_n。設當一部分花被移走後,剩下的花的高度依次為g_1, g_2, … , g_m,則棟棟希望下面兩個條件中至少有乙個滿足:

條件 a:對於1≤i≤m/2,g2i>g2i-1,同時對於1≤i

其實題目就是想找乙個最長的波浪形佇列。

dp

很顯然,處理乙個f[i]和g[i]就好了。

a[i]>a[k]:f[i]=max(g[k]+1,f[i]);a[i]

線段樹優化

因為我要找的是乙個位置,而且有值域的限制,所以可以用權值線段樹。

直接打乙個權值線段樹維護最大值就好了。

離散化

如果怕空間爆了,可以用離散化,雖然不用都可以。

#include

#include

#include

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

const

int maxn=100007;

const

int zuida=1000000;

struct nodet[zuida];

struct nodb[maxn];

using

namespace

std;

int i,j,k,l,n,m,ans,tot;

int a[maxn],f[maxn],g[maxn];

void insert(int x,int l,int r,int y,int z,int p)

else

}int find(int x,int l,int r,int y,int z,int p)

else

}}bool cmp(nod x,nod y)

sort(b+1,b+1+n,cmp);

a[b[1].b]=1;tot=1;

fo(i,2,n)

f[1]=g[1]=1;

insert(1,1,tot,a[1],f[1],1);

insert(1,1,tot,a[1],g[1],2);

fo(i,2,n)

printf("%d\n",ans);

}

NOIP2013提高組 花匠

題目描述 花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g...

NOIP 2013提高組 花匠 擺花

演算法 dp 貪心 題解 1 動態規劃 令f i 0.1 為兩種條件下前i株花的最大保留數量,狀態轉移方程 f i 0 max f j 1 1 j i 1.1 h i h j f i 1 max f j 0 1 j i 1.1 h i 初始化 f i 0 f i 1 1,這樣時間複雜度是o n 2 ...

Noip2013提高組day2 花匠

我們把原序列大概抽象在函式圖上,就會得出這樣的結果 如下圖 顯然,圈出來的點就是我們要保留的,不可能存在刪掉一大段會存在更優的情況。做法就是每次順著找乙個最高的點,再找乙個最低的點,如果存在相同的則視為乙個點。include include include define fo i,j,k for i...