海亮 2025暑 VIII

· · 个人记录

0822

how time flies!

很掉线啊,先不写了。

0823

home! Here we go!

T2

给定一个从小到大排好序的整数序列 A。

现在需要插入一些整数,使得序列中任意相邻两数之间的差值一样大,不能插入在开头和结尾。

问最少插入多少个整数才能满足要求,如果不能,则输出 -1。

由于值域只有 1e6,所以可以直接枚举公差 d 后进行判断。需要做的判断是序列 A 是否为序列b_i=i·d的子序列,总复杂度 O(V log V)。

或者把差分数组求出来,合法的最大公差一定是差分数组的 gcd,可直接完成判断。

注意对边界情况的特判,比如所有元素均相同,n=1,和无解的情况。

#include<bits/stdc++.h>
using namespace std;
int a[10000006];
int b[10000006];

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int ans=0;
        int g=0;
        int n;
        cin>>n;
        for(int i=1; i<=n; i++)
        {
            cin>>a[i];
        }
        bool flag=0;
        for(int i=1; i<n; i++)
        {
            b[i]=a[i+1]-a[i];
            if(b[i]==0) flag=1;
            if(b[i]==0 && i==1) g=b[i];
            else if(b[i]!=0) g=__gcd(g,b[i]);
        }
        if(flag && g!=0)
        {
            cout<<-1<<endl;
            continue;
        }
        if(flag && g==0)
        {
            cout<<0<<endl;
            continue;
        }

        for(int i=1; i<n; i++)
        {
            ans=ans+(b[i]/g)-1;
        }
        cout<<ans<<"\n";
    }
    return 0;
}

回家了,先不写了。