码迷,mamicode.com
首页 > 其他好文 > 详细

uva1471 Defense Lines

时间:2015-12-10 19:14:19      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
#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,,,思维方式很像。
*/
View Code

 居然又WA了。。。

uva1471 Defense Lines

标签:

原文地址:http://www.cnblogs.com/--560/p/5036452.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!