使用数据结构,最大上升子串问题

来源:互联网 发布:网络手势图片意思 编辑:程序博客网 时间:2024/06/03 20:03
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 200010
int num[maxn], l[maxn], r[maxn], Min[maxn];

int main() {
    int test, n;
    scanf("%d", &test);
    while(test--) {
        scanf("%d", &n);
        for(int i = 1; i <= n; i++)
            scanf("%d", &num[i]);
        l[1] = 1;
        for(int i = 2; i <= n; i++)//最大连续上升子序列问题,维护一个连续数组,遍历原数组截取最长子串
            l[i] = num[i] > num[i - 1] ? l[i - 1] + 1: 1;
        for(int i=1;i<=n;i++)printf("%d ",l[i]);
        cout<<"11111111111111"<<endl;
        r[n] = 1;
        for(int i = n - 1; i >= 1; i--)
            r[i] = num[i] < num[i + 1] ? r[i + 1] + 1: 1;
        for(int i=1;i<=n;i++)printf("%d ",r[i]);
        cout<<"22222222222222"<<endl;       
        int ans = 0;
        memset(Min,0x3f,sizeof(Min));
        for(int i = 1; i <= n; i++) {
            int len = lower_bound(Min+1,Min+1+n,num[i]) - Min;
            ans = max(ans,r[i] + len - 1);
            Min[l[i]] = min(Min[l[i]],num[i]);
            cout<<len<<" "<<ans<<" "<<Min[l[i]]<<" "<<l[i]<<" "<<r[i]<<" test"<<endl;
        }
        printf("%d\n",ans);
    }
    return 0;
}
0 0