源代码:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct Node
{
int S,P;
}i[500001];
vector <int> List[500001];
int n,Ans(0),f[500001],F[500001];
bool Vis[500001]={0};
bool Rule(Node t1,Node t2)
{
return t1.S<t2.S;
}
int main() //乱搞的竟然能过,数据太水了。
{
scanf("%d",&n);
for (int a=1;a<=n;a++)
{
scanf("%d",&f[a]);
i[a].S=f[a];
i[a].P=a;
}
sort(i+1,i+n+1,Rule);
for (int a=1;a<=n;a++)
{
int Left=i[a].P-1,Right=i[a].P+1;
Vis[i[a].P]=true;
while (Left&&!Vis[Left]&&!(f[Left]%i[a].S))
Left--;
while (Right<=n&&!Vis[Right]&&!(f[Right]%i[a].S))
Right++;
Left++;
Right--; //细节还得注意。
if (Ans<=Right-Left)
{
Ans=Right-Left;
List[Ans].push_back(Left);
}
}
int Sum=List[Ans].size();
sort(List[Ans].begin(),List[Ans].end()); //返回的是迭代器位置。
printf("%d %d\n",Sum,Ans);
for (int a=0;a<Sum;a++)
printf("%d ",List[Ans][a]);
return 0;
}
/*
不难发现,从最小的数开始枚举最优,所以升序检验。
且易得,最小的找过后就绝对不会再找了,因为模不了,打上标记。
*/