HDU 5489 Removed Interval
生活随笔
收集整理的這篇文章主要介紹了
HDU 5489 Removed Interval
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:求一段序列中刪掉L個連續元素后的LIS。
?
解法:我的想法很復雜= =怎么說呢……首先用nlogn的方法求LIS得到的序列dp的第i項的意義為上升子序列所有長度為i的序列結尾元素的最小值,那么先倒著用nlogn的方法求一遍最長下降子序列記為dp1,記錄每一步怎么更新的dp1,再正著求一遍最長上升子序列,每次看a[i]的時候二分的在i+k到結尾的dp1中找第一個比a[i]大的數設為dp1[pos],所以當前枚舉的答案即為以a[i]作為結尾的最長上升子序列+后一段以dp1[pos]開頭的最長上升子序列……枚舉1~n-l,就可以得到答案了TUT……
總之很艱辛……二分廢又得找隊友幫忙手寫二分什么的……
另一隊的人提出用線段樹算LIS……真·大神= =不懂怎么轉移的方程……
?
代碼:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<limits.h> #include<time.h> #include<stdlib.h> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #define LL long long int inf = 1000000005; using namespace std; int a[100005]; LL dp1[100005], dp2[100005]; struct node {bool isnew;int pos;int pre; }note[100005]; bool cmp(int a, int b) {return a > b; } template <class T> int rupper_bound(T *a, T *end, T key) {int n = end - a;if(n == 0) return INT_MAX;if (a[n-1] > key) return n-1;if (a[0] <= key) return INT_MAX;int l = 0, r = n - 1;while(r - l > 1) {int m = (l+r) >> 1;if (a[m] > key) l = m;else r = m;}return l; } int main() {int T;scanf("%d", &T);int cse = 1;while(T--){int n, l;scanf("%d%d", &n, &l);for(int i = 1; i <= n; i++)scanf("%d", &a[i]);a[0] = -inf;int max1 = 0, max2 = 0;for(int i = n; i > l; i--){int pos = upper_bound(dp1, dp1 + max1, a[i], cmp) - dp1;if(pos == max1){note[i].isnew = 1;note[i].pos = max1;dp1[max1++] = a[i];}else{note[i].isnew = 0;note[i].pos = pos;note[i].pre = dp1[pos];dp1[pos] = a[i];}}int ans = 0;LL s = -inf;int len = 0;for(int i = 1; i <= n - l + 1; i++){int pos = rupper_bound(dp1, dp1 + max1, s);if(pos == INT_MAX) ans = max(ans, len);else ans = max(ans, pos + 1 + len);int x = upper_bound(dp2, dp2 + max2, a[i]) - dp2;if(x == max2){len = max2 + 1;s = a[i];dp2[max2++] = a[i];}else{len = x + 1;s = a[i];dp2[x] = a[i];}if(note[i + l].isnew){max1--;}else{dp1[note[i + l].pos] = note[i + l].pre;}}printf("Case #%d: %d\n", cse++, ans);}return 0; }
轉載于:https://www.cnblogs.com/Apro/p/4842540.html
總結
以上是生活随笔為你收集整理的HDU 5489 Removed Interval的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 睿远基金怎么购买
- 下一篇: 微博借钱怎么分12期