Codeforces #209 (Div. 2) D. Pair of Numbers

思路:将ai排序,从小的开始枚举,两边拓展区间,被拓展的标记下

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

#define maxn 300005

int a[maxn];
int st[maxn];
bool vis[maxn];

struct node
{
    int idx,val;
}ask[maxn];

bool cmp(const node &a,const node &b)
{
    if(a.val==b.val) return a.idx<b.idx;
    else return a.val<b.val;
} 


int main()
{
    int n,cnt;
    int l,r,pos,num;
    int _max;
    while(scanf("%d",&n)!=EOF)
    {
        cnt=0;
        _max=0;
        for(int i=1;i<=n;++i)
        {
            scanf("%d",&ask[i].val);
            ask[i].idx=i;
            a[i]=ask[i].val;
            vis[i]=false;
        }
        sort(ask+1,ask+n+1,cmp);
        for(int i=1;i<=n;++i)
        {
            pos=ask[i].idx;
            if(!vis[pos])
            {
                //cout<<"pos--"<<pos<<endl;
                num=ask[i].val;
                l=r=pos;
                while(a[l]%num==0&&l>=1)
                {
                     vis[l]=true;
                     l--;
                }
                while(a[r]%num==0&&r<=n)
                {
                     vis[r]=true;
                     r++;
                }
                l++;
                r--;
                //cout<<"l--"<<l<<"  r--"<<r<<endl;
                if(r-l==_max)
                {
                    cnt++;
                    st[cnt]=l;
                }
                else if(r-l>_max)
                {
                    _max=r-l;
                    cnt=1;
                    st[cnt]=l;
                }
            }
        }
        printf("%d %d\n",cnt,_max);
        sort(st+1,st+cnt+1);
        for(int i=1;i<=cnt;++i)
            {
                printf("%d",st[i]);
                if(i==cnt) printf("\n");
                else printf(" ");
            }
    }
    return 0;
}
View Code

 

posted @ 2013-11-14 21:29  Think_RC  阅读(111)  评论(0)    收藏  举报