#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizoef(a)) using namespace std; typedef long long ll; const int maxn=1000100; const int INF=1<<29; int a[maxn],n; int f[maxn],g[maxn]; struct Node { int a,g; friend bool operator<(Node A,Node B) { return A.a<B.a; } }; int main() { freopen("in.txt","r",stdin); int T;cin>>T; while(T--){ scanf("%d",&n); REP(i,1,n) scanf("%d",&a[i]); g[1]=1; REP(i,2,n) g[i]=a[i]>a[i-1]?g[i-1]+1:1; f[n]=1; for(int i=n-1;i>=1;i--) f[i]=a[i]<a[i+1]?f[i+1]+1:1; int ans=1; set<Node> s; s.insert({a[1],g[1]}); bool can; REP(i,2,n){ Node t={a[i],g[i]}; //cout<<"i="<<i<<" a="<<a[i]<<" g="<<g[i]<<" f="<<f[i]<<endl; //for(set<Node>::iterator it=s.begin();it!=s.end();++it) cout<<(it->a)<<" "<<(it->g)<<endl; cout<<endl; set<Node>::iterator it=s.lower_bound(t);/// 找到第一个>=t的*it,然后判断能否插入 //out<<(it->a)<<" -"<<(it->g)<<endl; if(it==s.begin()){ if(it->a==a[i]){ if(it->g>=g[i]) can=0; else can=1; } else can=1; } else{ if(it->a==a[i]){ if(it->g>=g[i]) can=0; else can=1; } else{ /// 判断前一个确定能否插入 set<Node>::iterator it1=it;--it1; if(it1->g>=g[i]) can=0; else can=1; } } if(can){ bool flag=0; while(it!=s.end()){ if(flag) break; if(it->a==a[i]){ set<Node>::iterator it1=it;++it1; s.erase(it); it=it1; } else{ set<Node>::iterator it1=it;++it1; if(it->g<=g[i]) s.erase(it),it=it1; else flag=1; } } } int tmp; if(it==s.begin()) tmp=f[i]; else tmp=(--it)->g+f[i]; //cout<<(it->a)<<" "<<(it->g)<<"=="<<endl; ans=max(ans,tmp); //cout<<"tmp="<<tmp<<endl; //if(tmp==5) cout<<"i="<<i<<" f[i]="<<f[i]<<" a="<<(it->a)<<" g="<<(it->g)<<" g[i]="<<g[i]<<endl; s.insert(t); //for(set<Node>::iterator it=s.begin();it!=s.end();++it) cout<<(it->a)<<"_"<<(it->g)<<endl; cout<<endl; } cout<<ans<<endl; } return 0; } /** 用set维护的经典题。 单调栈,单调队列,set,,,思维方式很像。 */
居然又WA了。。。
时间: 2024-10-14 00:39:53