題目描述
在幻想鄉,琪露諾是以笨蛋聞名的冰之妖精。
某一天,琪露諾又在玩速凍青蛙,就是用冰把青蛙瞬間凍起來。但是這只青蛙比以往的要聰明許多,在琪露諾來之前就已經跑到了河的對岸。於是琪露諾決定到河岸去追青蛙。
小河可以看作一列格仔依次編號為0到n,琪露諾只能從編號小的格仔移動到編號大的格仔。而且琪露諾按照一種特殊的方式進行移動,當她在格仔i時,她只移動到區間[i+l,i+r]中的任意一格。你問為什麼她這麼移動,這還不簡單,因為她是笨蛋啊。
每乙個格仔都有乙個冰凍指數a[i],編號為0的格仔冰凍指數為0。當琪露諾停留在那一格時就可以得到那一格的冰凍指數a[i]。琪露諾希望能夠在到達對岸時,獲取最大的冰凍指數,這樣她才能狠狠地教訓那只青蛙。
但是由於她實在是太笨了,所以她決定拜託你幫它決定怎樣前進。
開始時,琪露諾在編號0的格仔上,只要她下一步的位置編號大於n就算到達對岸。
輸入格式
第1行:3個正整數n, l, r
第2行:n+1個整數,第i個數表示編號為i-1的格仔的冰凍指數a[i-1]
輸出格式
乙個整數,表示最大冰凍指數。保證不超過2^31-1
輸入輸出樣例
輸入 #1
5 2 3
0 12 3 11 7 -2
輸出 #1
11說明/提示
對於60%的資料:n <= 10,000
對於100%的資料:n <= 200,000
對於所有資料 -1,000 <= a[i] <= 1,000且1 <= l <= r <= n
解題思路:
由於對於每一次i
ii,均是從arr
[i+l
]arr[i+l]
arr[i+
l]到a rr
[i+r
]arr[i+r]
arr[i+
r]中挑選乙個最大的值,於是我們就可以用單調佇列維護這個最大值即可。
**:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue,greater>q;
const int maxn = (int)1e5 + 5;
const ll mod = 1e9+7;
typedef pairp;
p arr[200100];
dequeq;
int main()
arr[n+1].second=0;arr[n+1].first=n+1;
q.push_back(arr[n+1]);
lep(i,n-l,0)
q.push_back(arr[i+l]);
if(q.front().first>i+r)
arr[i].second=arr[i].second+q.front().second;
}printf("%d\n",arr[0].second);
return 0;
}
洛谷P1725 琪露諾(單調佇列dp)
傳送門 dp方程很簡單啊,dp i max val i 暴力找最大值只有60分,考慮優化,很明顯,用單調佇列維護乙個滑動視窗即可。起點至少是l,答案的 最多是n l。話說單調佇列寫起來好噁心啊。每次都寫不對。還是要多練看來 include define n 200005 using namespac...
洛谷P1725 琪露諾
在幻想鄉,琪露諾是以笨蛋聞名的冰之妖精。某一天,琪露諾又在玩速凍青蛙,就是用冰把青蛙瞬間凍起來。但是這只青蛙比以往的要聰明許多,在琪露諾來之前就已經跑到了河的對岸。於是琪露諾決定到河岸去追青蛙。小河可以看作一列格仔依次編號為0到n,琪露諾只能從編號小的格仔移動到編號大的格仔。而且琪露諾按照一種特殊的...
洛谷 P1725 琪露諾
題目鏈結 在幻想鄉,琪露諾是以笨蛋聞名的冰之妖精。某一天,琪露諾又在玩速凍青蛙,就是用冰把青蛙瞬間凍起來。但是這只青蛙比以往的要聰明許多,在琪露諾來之前就已經跑到了河的對岸。於是琪露諾決定到河岸去追青蛙。小河可以看作一列格仔依次編號為0到n,琪露諾只能從編號小的格仔移動到編號大的格仔。而且琪露諾按照...