UVA 1471 Average

来源:互联网 发布:奶瓶 linux 编辑:程序博客网 时间:2024/06/05 00:40

这道题很简单,直接AC就可以了。

#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<map>
#include<set>
#include<list>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
using namespace std;
int num1[200001],num2[200001],num[200001];
struct point
{
    int a,b;
    bool operator < (const point x)const
    {
        if(a!=x.a) return a<x.a;
        else return b>x.b;
    }
};
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,maxx=1,sum;
        cin>>n;
        set<point> s;
        memset(num1,0,sizeof(num));
        memset(num2,0,sizeof(num));
        for(int i=0;i<n;i++) cin>>num[i];
        for(int i=0;i<n;i++)
        {
            if(!i) num1[i]=1;
            else
            {
                if(num[i]>num[i-1])
                {
                    num1[i]=num1[i-1]+1;
                }
                else
                {
                    num1[i]=1;
                }
            }
        }
        for(int i=n-1;i>=0;i--)
        {
            if(i==(n-1)) num2[i]=1;
            else
            {
                if(num[i]<num[i+1])
                {
                    num2[i]=num2[i+1]+1;
                }
                else
                {
                    num2[i]=1;
                }
            }
        }
        for(int i=0;i<n;i++)
        {
            point p;
            p.a=num[i];
            p.b=1000000001;
            set<point>::iterator jj=s.lower_bound(p);
            if(jj!=s.begin())
            {
                jj--;
                sum=(*jj).b+num2[i];
                if(sum>maxx) maxx=sum;
            }
            p.a=num[i];
            p.b=num1[i];
            s.insert(p);
            set<point>::iterator j=s.find(p);
            if(j!=s.begin() && (*(--j)).b>=(*(++j)).b) s.erase(j);
            else if((++j)!=s.end())
            {
                set<point>::iterator jjj=j;
                j--;
                for(set<point>::iterator k=jjj;k!=s.end();)
                {
                    if((*j).a<(*k).a)
                    {
                        if((*k).b<=(*j).b)
                        {
                            s.erase(k++);
                        }
                        else break;
                    }
                    else
                    {
                        s.erase(k++);
                    }
                }
            }
        }
        if(n==0) maxx=0;
        cout<<maxx<<endl;
    }
}

0 0
原创粉丝点击