Pair of Numbers CodeForces - 359D 暴力

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

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. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值