又是暴力,自己又不会,而且别人的更加巧妙了
Codeforces Round #209 (Div. 2) D:http://codeforces.com/contest/359/problem/D
题意:给以一个n个数的序列,然后问你最大的区间l,r,在这个区间里面,存在一个数是这个区间所有数的约数,如果这个区间有多个,统计有多少个以及每个区间的左端点。
- int a[300005], w[300005]; //感觉别人好清晰的思路啊
- int main()
- {
- int n, i, l, r, cnt = 0, maxd = 0;
- scanf("%d", &n);
- for (i = 0; i < n; i++) scanf("%d", &a[i]);
- for (i = 0; i < n;)
- {
- l = r = i;
- while (l && a[l - 1] % a[i] == 0) l--; ///左移
- while (r < n - 1 && a[r + 1] % a[i] == 0) r++; ///右移
- i = r + 1; /// 关键一步,保证算法是O(n)的,这样做是利用“连续性”及这些数已经能被a[i]整除
- r -= l; ///现在r相当于r-l
- if (r > maxd) cnt = 0, maxd = r;
- if (r == maxd) w[cnt++] = l + 1;
- }
- printf("%d %d\n", cnt, maxd);
- for (i = 0; i < cnt; ++i) printf("%d ", w[i]); ///多打一个空格没问题
- return 0;
- }