CodeForces - 359D Pair of Numbers (单调栈)
2017-09-05 17:56
232 查看
题目链接:http://codeforces.com/problemset/problem/359/D点击打开链接
D. Pair of Numbers
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Simon has an array a1, a2, ..., an,
consisting of n positive integers. Today Simon asked you to find a pair of integers l, r (1 ≤ l ≤ r ≤ n),
such that the following conditions hold:
there is integer j (l ≤ j ≤ r),
such that all integers al, al + 1, ..., ar are
divisible by aj;
value r - l takes the maximum value among all pairs for which condition 1 is
true;
Help Simon, find the required pair of numbers (l, r). If there are multiple required pairs find all of them.
Input
The first line contains integer n (1 ≤ n ≤ 3·105).
The second line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 106).
Output
Print two integers in the first line — the number of required pairs and the maximum value of r - l. On the following line
print all l values from optimal pairs in increasing order.
Examples
input
output
input
output
input
output
Note
In the first sample the pair of numbers is right, as numbers 6, 9, 3 are divisible by 3.
In the second sample all numbers are divisible by number 1.
In the third sample all numbers are prime, so conditions 1 and 2 are
true only for pairs of numbers (1, 1), (2, 2), (3, 3), (4, 4), (5, 5).
D. Pair of Numbers
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Simon has an array a1, a2, ..., an,
consisting of n positive integers. Today Simon asked you to find a pair of integers l, r (1 ≤ l ≤ r ≤ n),
such that the following conditions hold:
there is integer j (l ≤ j ≤ r),
such that all integers al, al + 1, ..., ar are
divisible by aj;
value r - l takes the maximum value among all pairs for which condition 1 is
true;
Help Simon, find the required pair of numbers (l, r). If there are multiple required pairs find all of them.
Input
The first line contains integer n (1 ≤ n ≤ 3·105).
The second line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 106).
Output
Print two integers in the first line — the number of required pairs and the maximum value of r - l. On the following line
print all l values from optimal pairs in increasing order.
Examples
input
5 4 6 9 3 6
output
1 3 2
input
5 1 3 5 7 9
output
1 4 1
input
5 2 3 5 7 11
output
5 0 1 2 3 4 5
Note
In the first sample the pair of numbers is right, as numbers 6, 9, 3 are divisible by 3.
In the second sample all numbers are divisible by number 1.
In the third sample all numbers are prime, so conditions 1 and 2 are
true only for pairs of numbers (1, 1), (2, 2), (3, 3), (4, 4), (5, 5).
#include <iostream> #include <stdio.h> #include <set> #include <vector> #include <map> #include <algorithm> #include <string> #include <cstring> #include <limits.h> #include <math.h> #include <stack> #include <queue> using namespace std; int gcd(int x,int y) { if(x%y==0||y%x==0) return 1; return 0; } int a[300010]; int la[300010]; int ra[300010]; set<int > q; set<int > ::iterator it; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); stack<int > s; for(int i=1;i<=n;i++) { la[i]=i; if(s.empty()) { s.push(i); } else { while(!s.empty()) { if(a[s.top()]%a[i]==0) { la[i]=la[s.top()]; s.pop(); } else if(a[i]%a[s.top()]==0) { s.push(i); break; } else { s.push(i); break; } } if(s.empty()) s.push(i); } } while(!s.empty()) s.pop(); for(int i=n;i>=1;i--) { ra[i]=i; if(s.empty()) { s.push(i); } else { while(!s.empty()) { if(a[s.top()]%a[i]==0) { ra[i]=ra[s.top()]; s.pop(); } else if(a[i]%a[s.top()]==0) { s.push(i); break; } else { s.push(i); break; } } if(s.empty()) s.push(i); } } int maxn=0;int cnt=0; for(int i=1;i<=n;i++) maxn=max(maxn,ra[i]-la[i]); for(int i=1;i<=n;) if((ra[i]-la[i])==maxn) cnt++,q.insert(la[i]),i=(ra[i]+1); else i++; printf("%d %d\n",cnt,maxn); for(it=q.begin();it!=q.end();it++) printf("%d ",(*it)); }
相关文章推荐
- codeforces 167C Wizards and Numbers(找规律,博弈)
- Codeforces 300 C Beautiful Numbers (Locas)
- Codeforces 850B - Arpa and a list of numbers(前缀和)
- codeforces-385C Bear and Prime Numbers(素数筛选法+维护前缀和)
- ACM学习历程—Codeforces 446C DZY Loves Fibonacci Numbers(线段树 && 数论)
- codeforces 401D D. Roman and Numbers(状态压缩dp+数论)
- CodeForces 385C Bear and Prime Numbers 素数打表
- CodeForces 547B (单调栈)
- 【Codeforces 817C. Really Big Numbers】+ 二分
- Codeforces - 817D - Imbalanced Array (单调栈)
- CodeForces - 548D Mike and Feet(单调栈)
- 数学 之 Codeforces 359D - Pair of Numbers
- Codeforces 34C-Page Numbers(set+vector+暴力乱搞)
- CodeForces 55D Beautiful numbers
- Codeforces 385C Bear and Prime Numbers [素数筛法]
- [高维前缀和] Codeforces 449D - Jzzhu and Numbers
- [Codeforces 919F]A Game With Numbers
- 数学 之 Codeforces 359D - Pair of Numbers
- CodeForces 3107 ODDDIV - Odd Numbers of Divisors(数论)
- CodeForces - 359D D. Pair of Numbers