HDU 4604 Deque
来源:互联网 发布:无线鼠标推荐知乎 编辑:程序博客网 时间:2024/05/20 22:30
#include<cstdio>#include<cstring>#include<vector>#include<algorithm>using namespace std;const int maxn = 100010;int a[maxn], n;int dp_up[maxn], num_up[maxn];int dp_down[maxn], num_down[maxn];void GetAns(int dp[], int num[]){ vector<int> v; v.push_back(a[n]); for(int i = n-1; i >= 1; i --) { int sz=v.size(); if(a[i] > v[sz - 1]) { v.push_back(a[i]); dp[i] = sz + 1; num[i] = 1; } else if(a[i] == v[sz-1]) { vector<int>::iterator iter; iter = upper_bound ( v.begin(), v.end(), a[i] ); dp[i] = iter - v.begin() + 1; v.push_back(a[i]); pair<vector<int>::iterator, vector<int>::iterator> bounds; bounds = equal_range(v.begin(), v.end(), a[i]); num[i] = bounds.second - bounds.first; } else { vector<int>::iterator iter; iter = upper_bound(v.begin(),v.end(),a[i]); dp[i] = iter - v.begin() + 1; *iter = a[i]; pair<vector<int>::iterator, vector<int>::iterator> bounds; bounds = equal_range(v.begin(), v.end(), a[i]); num[i] = bounds.second -bounds.first; } }}int main(){ int t; scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i = 1; i <= n; i ++) { scanf("%d",&a[i]); } GetAns(dp_up,num_up); for(int i = 1; i <= n; i ++) { a[i] = -a[i]; } GetAns(dp_down,num_down); int maxans=0; for(int i = 1; i <= n; i ++) { maxans=max(maxans,dp_up[i]+dp_down[i]-min(num_up[i],num_down[i])); } printf("%d\n",maxans); } return 0;}