http://codeforces.com/contest/359/problem/D

题意:给你n个数,然后找出在[l,r]中有一个数a[j],l<=j<=r,在[l,r]中的所有数都是a[j]的倍数。找出符合这样的r-l最长长度的个数,输出r-l最长长度的个数和长度,然后输出符合的l的序列。

枚举每一个数,然后向左找到l,向右找到r,r-l就是所求的符合一种,这样就可以找到最长的长度

cf D. Pair of Numbers_i++cf D. Pair of Numbers_i++_02
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 300100
 5 using namespace std;
 6 
 7 int a[maxn];
 8 int n;
 9 int p[maxn];
10 
11 int main()
12 {
13     while(scanf("%d",&n)!=EOF)
14     {
15         int s,t;
16         for(int i=1; i<=n; i++)
17         {
18             scanf("%d",&a[i]);
19         }
20         int max1=0;
21         int t1=0;
22         for(int i=1; i<=n; )
23         {
24             s=i;
25             t=i;
26             while(s>=1&&a[s]%a[i]==0) s--;
27             while(t<=n&&a[t]%a[i]==0) t++;
28             i=t;
29             int len=t-s-2;
30             if(len>max1)
31             {
32                 t1=0;
33                 max1=len;
34             }
35             if(len==max1)
36             {
37                 p[t1++]=s+1;
38             }
39         }
40         printf("%d %d\n",t1,max1);
41         for(int i=0; i<t1; i++)
42         {
43             if(i==0) printf("%d",p[i]);
44             else printf(" %d",p[i]);
45         }
46         printf("\n");
47     }
48     return 0;
49 }
View Code