P3572 [POI2014]PTA-Little Bird
生活随笔
收集整理的這篇文章主要介紹了
P3572 [POI2014]PTA-Little Bird
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
P3572 [POI2014]PTA-Little Bird
一只鳥從1跳到n。從1開始,跳到比當前矮的不消耗體力,否則消耗一點體力,每次詢問有一個步伐限制k,求每次最少耗費多少體力
很簡短的題目哼。
首先對于一個點, 他的狀態一定是由前 \(k\) 個轉移過來的。 \(k\) 的長度在每組詢問內一定, 想到用單調隊列維護 \(dp\) 。
不過此時單調隊列里的元素有兩個關鍵字: 勞累度和高度, 因為跳到比這個點高的樹需要花費恒為一點體力(這個很重要), 所以我們維護單調隊列的時候可以以勞累度為第一關鍵字, 高度為第二關鍵字進行比較, 為多個關鍵字的單調隊列
解釋一下為什么體力花費恒為一點很重要。 這里運用了一點貪心的思想: 此題的高度對體力消耗沒有影響, 只有高和矮兩種說法。 只要我的勞累值比你小, 不管你的高度有多低, 我 $ + 1$ 一定 \(<=\) 你, 所以可以把高度作為第二關鍵字比較, 從而不影響結果
Code
教訓: 多次調用簡單函數會大大降低算法的效率, 開一波 \(O2\) 才沒 \(T\) 。
// luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> #define LL long long using namespace std; int RD(){int flag = 1, out = 0;char c = getchar();while(c < '0' || c > '9'){if(c == '-')flag = -1;c = getchar();}while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}return flag * out;} const int maxn = 1000019; int len, num ,k; int h[maxn]; int dp[maxn]; struct Que{int h, val, index;Que (int h, int val, int index): h(h), val(val), index(index){}Que(){};bool operator < (Que const &a)const{if(val != a.val)return val < a.val;return h > a.h;}}Q[maxn]; int head, tail; void push_back(Que x){while(head <= tail && x < Q[tail])tail--;Q[++tail] = x;} void check(int x){while(x - Q[head].index > k)head++;} int get_min(){return Q[head].val;} int main(){len = RD();for(int i = 1;i <= len;i++)h[i] = RD();num = RD();while(num--){k = RD();head = 1, tail = 0;Q[head] = Que(1e9 + 19, 0, 0);memset(dp, 0, sizeof(dp));for(int i = 1;i <= len;i++){check(i);if(h[i] < Q[head].h)dp[i] = get_min();else dp[i] = get_min() + 1;push_back(Que(h[i], dp[i], i));}printf("%d\n", dp[len]);}return 0;}轉載于:https://www.cnblogs.com/Tony-Double-Sky/p/9339048.html
總結
以上是生活随笔為你收集整理的P3572 [POI2014]PTA-Little Bird的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java多线程编程实战指南+设计模式篇p
- 下一篇: centOS 6.5 yum升级 gcc