日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 5489 Removed Interval

發布時間:2024/10/12 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。