SCOI2014 方伯伯的玉公尺田

2022-03-26 21:05:49 字數 1027 閱讀 2533

題目

首先乙個很顯然的事實,我們所有操作的區間的右端點都是\(n\),即我們操作的區間是一些字尾

這個很好理解啊,我們使得乙個區間整體增加是為了盡可能和前面的點形成不降子串行,並沒有必要僅提公升一段區間的高度使得這一段難以和後面的接上,所以直接操作到\(n\)一定是最優的。

設\(dp_\)表示前\(i\)個字尾操作共操作了\(j\)次,顯然有轉移

\[dp_=\max_=\max_=\max_\)能向\(dp_\)進行轉移,那麼必定會滿足\(a_k-a_i=j-p\),即\(a_k+p=a_i+j\)。我們還是維護多個樹狀陣列,去第\(a_i+j\)個樹狀陣列里查下標不超過\(j\)的,這樣對應的\(a_k\)就肯定會大於\(a_i\)。當然加入\(dp_\)的時候要加到第\(a_i+j\)個樹狀陣列的第\(j\)個位置。

複雜度就是\(o(nk\log a_ik)\)

**

#include#define re register

#define lb(x) ((x)&(-x))

#define max(a,b) ((a)>(b)?(a):(b))

inline int read()

const int maxn=1e4+5;

int n,k,a[maxn],m;

int c[505][5005],d[5505][505],dp[maxn][505];

inline int qmax(int id,int x)

inline void add(int id,int x,int v)

inline int qmax(int id,int x)

inline void add(int id,int x,int v)

int main()

int ans=0;

for(re int i=1;i<=n;i++) ans=max(ans,dp[i][k]);

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

return 0;

}

SCOI2014 方伯伯的玉公尺田

方伯伯在自己的農田邊散步,他突然發現田裡的一排玉公尺非常的不美。這排玉公尺一共有n株,它們的高度參差不齊。方伯伯認為單調不下降序列很美,所以他決定先把一些玉公尺拔高,再把破壞美感的玉公尺拔除掉,使得剩下的玉公尺的高度構成乙個單調不下降序列。方伯伯可以選擇乙個區間,把這個區間的玉公尺全部拔高1單位高度...

SCOI2014 方伯伯的玉公尺田

洛谷題目鏈結 動態規劃 首先,仔細看題目明確一點,如果要拔高,無論怎麼拔,拔高的區間右端點一定是 n 為什麼呢?這樣做 1 對於區間左邊,不會減小以前的最優決策 2 對於區間內,兩兩之間相對高度不會發生變化 3 對於區間右邊,會減小它們進入最優序列的可能性 所以操作區間在右端點就可以解決第三個問題 ...

方伯伯的玉公尺田 SCOI2014

方伯伯在自己的農田邊散步,他突然發現田裡的一排玉公尺非常的不美。這排玉公尺一共有n株,它們的高度參差不齊。方伯伯認為單調不下降序列很美,所以他決定先把一些玉公尺拔高,再把破壞美感的玉公尺拔除掉,使得剩下的玉公尺的高度構成乙個單調不下降序列。方伯伯可以選擇乙個區間,把這個區間的玉公尺全部拔高1單位高度...