数字对

源代码:

#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
",Sum,Ans);
    for (int a=0;a<Sum;a++)
      printf("%d ",List[Ans][a]);
    return 0;
}

/*
    不难发现,从最小的数开始枚举最优,所以升序检验。
    且易得,最小的找过后就绝对不会再找了,因为模不了,打上标记。
*/
原文地址:https://www.cnblogs.com/Ackermann/p/6065721.html