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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

uva-1471

發(fā)布時間:2024/4/11 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uva-1471 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意:給一個長度為n(n<=200000)的序列,刪除一個連續(xù)的子序列,使得剩下的序列中有一個長度最大的連續(xù)遞增子序列。

分析:從前往后記錄每個位置的最長連續(xù)遞增序列,從后往前記錄每個位置的最長連續(xù)遞增序列。

作者代碼

#include<cstdio>#include<set>#include<cassert>using namespace std;const int maxn = 200000 + 5;int n, a[maxn], f[maxn], g[maxn];struct Candidate {int a, g;Candidate(int a, int g):a(a),g(g) {}bool operator < (const Candidate& rhs) const {return a < rhs.a;}};set<Candidate> s;int main() {int T;scanf("%d", &T);while(T--) {scanf("%d", &n);for(int i = 0; i < n; i++)scanf("%d", &a[i]);if(n == 1) { printf("1\n"); continue; }// g[i] is the length of longest increasing continuous subsequence ending at ig[0] = 1;for(int i = 1; i < n; i++)if(a[i-1] < a[i]) g[i] = g[i-1] + 1;else g[i] = 1;// f[i] is the length of longest increasing continuous subsequence starting from if[n-1] = 1;for(int i = n-2; i >= 0; i--)if(a[i] < a[i+1]) f[i] = f[i+1] + 1;else f[i] = 1;s.clear();s.insert(Candidate(a[0], g[0]));int ans = 1;for(int i = 1; i < n; i++) {Candidate c(a[i], g[i]);set<Candidate>::iterator it = s.lower_bound(c); // first one that is >= cbool keep = true;if(it != s.begin()) {Candidate last = *(--it); // (--it) points to the largest one that is < c找到比它小的可以直接接上去int len = f[i] + last.g; ans = max(ans, len);if(c.g <= last.g) keep = false;}if(keep) {s.erase(c); // if c.a is already present, the old g must be <= c.gs.insert(c);it = s.find(c); // this is a bit cumbersome and slow but it's clearit++;while(it != s.end() && it->a > c.a && it->g <= c.g) s.erase(it++);}}printf("%d\n", ans);}return 0;}

?

總結(jié)

以上是生活随笔為你收集整理的uva-1471的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。