BZOJ1049 HAOI2006 數字序列0

2022-05-08 05:15:10 字數 1233 閱讀 2439

現在我們有乙個長度為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...