題目:http://codeforces.com/problemset/problem/455/E
題意:給定數(shù)組a,及f的定義:
成都創(chuàng)新互聯(lián)專注于治多企業(yè)網(wǎng)站建設(shè),
自適應(yīng)網(wǎng)站建設(shè),
成都做商城網(wǎng)站。治多網(wǎng)站建設(shè)公司,為治多等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站開發(fā),專業(yè)設(shè)計,全程項目跟蹤,
成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
f[1][j] = a[j]; 1 <= j <= n
f[i][j] = min(f[i-1][j-1], f[i-1][j]) + a[j]; 2 <= i <= j <= n
給定q個詢問,每個詢問為l,r,求f[l][r]
My solution:
寫一些小數(shù)據(jù)就可以發(fā)現(xiàn),其實對于一個詢問l,r,其實等價于:
從[r-l+1, r]這個區(qū)間內(nèi)取l個數(shù),使其和最小。但是比較特殊的是,一個數(shù)可以取多次,并且如果取了一個x,那么[x+1,r]間的所有數(shù)必須得取。
例如,對于n=3, a = {2, 1, 3}
詢問l=3, r=3的取法有:3+3+3=9, 3+3+1=7, 3+1+1=5, 3+1+2= 6;答案為3+1+1=5
2.設(shè)答案f[l][r]的詢問答案合法區(qū)間是在[x, r]這一段取得的,我們還可以發(fā)現(xiàn)如下的性質(zhì):
1)a[x]一定是[x,r]中最小的,否則存在 x<=y<=r, a[y] <= a[x],比[x,r]更優(yōu)的區(qū)間[y, r]
除[y, r]的共同區(qū)間外,剩下的l-y-r個[y,r]區(qū)間可以全取a[y],顯然比[x,r]更小
2)a[x+1]~a[y]各取一個,剩下的全取a[x],因為a[x]是區(qū)間最小元素,取越多答案越小
3.基于2我們可以維護一個遞增的序列來求答案,但是這樣還是不夠,妥妥TlE
只能看下決策之間有什么關(guān)系了;
對于詢問(l,r)不妨設(shè)兩個決策k 那么 (sum[r] - sum[k]) - (l - (r - k)) * a[k] <= (sum[r] - sum[j]) - (l - (r - j)) * a[j];
整理一下式子:
(sum[k] - a[k]*k) - (sum[j] - a[j]*j) / (a[k] - a[j]) <= l - r;
這不就是個斜率的式子,剩下的就是維護一個凸殼即可
4.具體的話對于詢問按照r排序,然后離線做
然后二分一左邊界,找到合法區(qū)間完,再二分找到合法的斜率。具體看代碼吧
code:
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
View Code
文章題目:codeforces455E-創(chuàng)新互聯(lián)
文章鏈接:http://weahome.cn/article/jsdog.html