防线Defense Lines

来源:互联网 发布:tensorflow graph 编辑:程序博客网 时间:2024/04/28 14:26
//紫书P242//UVA1471Defense Lines//Serene#include<algorithm>#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>#include<set>using namespace std;const int maxn=2e5+10;int t,n,a[maxn],f[maxn],g[maxn];int aa=0;char c;int read(){    aa=0;c=getchar();    while(c<'0'||c>'9') c=getchar();    while(c>='0'&&c<='9') aa=aa*10+c-'0',c=getchar();    return aa;}struct node{    int a,g;    node(const int a=0,const int g=0) : a(a),g(g){}    bool operator < (const node& b) const {          return a<b.a;    }};int main(){    int ans;    t=read();    while(t--) {          n=read();          for(int i=0;i<n;++i) a[i]=read();        if(n==1) {cout<<n<<"\n";continue;}        g[0]=1;f[n-1]=1;          for(int i=1;i<n;++i) if(a[i]>a[i-1]) g[i]=g[i-1]+1; else g[i]=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;        set<node> G; G.insert(node(a[0],g[0])); ans=1;        set<node> :: iterator it;        for(int i=1;i<n;++i) {            bool ok=1;            node v=node(a[i],g[i]);            it=G.lower_bound(v);            if(it!=G.begin()) {                it--;                int len=it->g+f[i];                ans=max(ans,len);                if(it->g>=g[i]) ok=0;            }            if(ok){                G.erase(v); G.insert(v);                it=G.find(v); it++;                while(it!=G.end()&&it->g<=v.g) G.erase(it++);            }        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击