現在我們有乙個長度為n的整數序列a。但是它太不好看了,於是我們希望把它變成乙個單調嚴格上公升的序列。
但是不希望改變過多的數,也不希望改變的幅度太大。
第一行包含乙個數n,接下來n個整數按順序描述每一項的鍵值。n<=35000,保證所有數列是隨機的
第一行乙個整數表示最少需要改變多少個數。 第二行乙個整數,表示在改變的數最少的情況下,每個數改變
的絕對值之和的最小值。
45 2 3 514
正解:dp
解題報告:
考慮補集轉換,題目轉換為:最大化不修改的點。
對於任意的i,j(j=i-j,不妨設b[i]=a[i]-i,則條件變為b[i]>=b[j],至此第一問最長不降子串行可做。
第二問,不妨設g[i]為1到i的答案,則
$$$$
j需要滿足:j可以轉移到i且$$$$
cost[j,i]表示修改[j,i]的最小代價
結論:必定存在點t使得[j,t]都為bj,[t+1,i]都為bi。證明從略
只需每次找到乙個分割點,暴力列舉即可。細節較多。
1//it is made by ljh2000
2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include
10using
namespace
std;
11 typedef long
long
ll;12
const
int maxn = 35011;13
const ll inf = (1ll<<50
);14
intn;
15ll a[maxn],g[maxn],cost1[maxn],cost2[maxn],b[maxn],c[maxn],ans,f[maxn];
16 vectorw[maxn];
17 inline int
getint()
21 inline int find(ll x) return
pos; }
22 inline void
work()37}
38w[f[i]].push_back(i);39}
40 printf("
%lld
",g[n]);41}
4243
intmain()
44
bzoj1049 HAOI2006 數字序列
設f i 為以i開頭的最長上公升序列的長度,第乙個元素a i 必須滿足f i m,第x個元素為a y 則第 x 1 個元素a z 需要滿足的條件是a z a y 且f z f y 1 這位的題解很詳細 const int n 35010 struct edge edge int to,edge ne...
BZOJ1055 HAOI 玩具取名
某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後 他會根據自己的喜好,將名字中任意乙個字母用 wing 中任意兩個字母代替,使得自己的名字能夠擴充得很長。現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個字母變形過來的。第一行四個整數w i n...
BZOJ 1046 HAOI 上公升序列
1046 haoi2007 上公升序列 time limit 10 sec memory limit 162 mbsubmit 5376 solved 1862 submit status discuss description 對於乙個給定的s 若有p 滿足 x1 x2 xm 且 ax1 2 出s...