Pair of Numbers CodeForces

来源:互联网 发布:淘宝网主要栏目 编辑:程序博客网 时间:2024/05/21 06:37

又是暴力,自己又不会,而且别人的更加巧妙了

Codeforces Round #209 (Div. 2) D:http://codeforces.com/contest/359/problem/D

题意:给以一个n个数的序列,然后问你最大的区间l,r,在这个区间里面,存在一个数是这个区间所有数的约数,如果这个区间有多个,统计有多少个以及每个区间的左端点。


  1. int a[300005], w[300005];  //感觉别人好清晰的思路啊
  2.   
  3. int main()  
  4. {  
  5.     int n, i, l, r, cnt = 0, maxd = 0;  
  6.     scanf("%d", &n);  
  7.     for (i = 0; i < n; i++) scanf("%d", &a[i]);  
  8.     for (i = 0; i < n;)  
  9.     {  
  10.         l = r = i;  
  11.         while (l && a[l - 1] % a[i] == 0) l--; ///左移  
  12.         while (r < n - 1 && a[r + 1] % a[i] == 0) r++; ///右移  
  13.         i = r + 1; /// 关键一步,保证算法是O(n)的,这样做是利用“连续性”及这些数已经能被a[i]整除  
  14.         r -= l; ///现在r相当于r-l  
  15.         if (r > maxd) cnt = 0, maxd = r;  
  16.         if (r == maxd) w[cnt++] = l + 1;  
  17.     }  
  18.     printf("%d %d\n", cnt, maxd);  
  19.     for (i = 0; i < cnt; ++i) printf("%d ", w[i]); ///多打一个空格没问题  
  20.     return 0;  
  21. }  

0 0
原创粉丝点击