这个题有点难以理解。。。。不是很懂,似懂非懂
我只能写到init部分。
#include<bits/stdc++.h>
using namespace std;
const int mxn=200000+5;
int a[mxn],f[mxn],g[mxn],n;
struct node{
int a,g;
node (int a,int g):a(a),g(g){}
bool operator <(const node & k) const{
return this->a < k.a;
}
};
set <node> s;
void init(){
// memset(a,0,sizeof(a));
// memset(f,0,sizeof(f));
// memset(g,0,sizeof(g));
s.clear();
scanf("%d",&n);
// printf("yes\n");
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
// printf("yes\n");
g[0]=1;
for(int i=1;i<n;i++){
if(a[i]>a[i-1]){
g[i]=g[i-1]+1;
}
else{
g[i]=1;
}
}
f[n-1]=1;
for(int i=n-2;i>-1;i--){
if(a[i]<a[i+1]){
f[i]=f[i+1]+1;
}
else{
f[i]=1;
}
}
// printf("yes\n");
}
int main(void){
int t;
scanf("%d",&t);
while(t--){
init();
if(n == 1) { printf("1\n"); continue; }
s.insert(node(a[0],g[0]));
int ans=1;
for(int i=1;i<n;i++){
node c(a[i],g[i]);
set<node>::iterator it=s.lower_bound(c);
bool keep = true;
if(it!=s.begin()){
node last=(*--it);
int len=f[i]+last.g;
ans=max(ans,len);
if(c.g<=(*it).g) keep = false;
}
if(keep){
s.erase(c);
s.insert(c);
it=s.find(c);
it++;
while(it!=s.end()&&it->a > c.a&& it->g <= c.g) s.erase(it++);
}
}
printf("%d\n",ans);
}
return 0;
}