1 条题解

  • 0
    @ 2026-6-17 15:02:36

    20 分做法

    20 分留给暴力。可以枚举所有两个点对 (xi,yi)(x_i, y_i) 和 (xj,yj)(x_j, y_j) ,把从 ii 点到 jj 点的咒语 (xi−xi,yj−xj)(x_i - x_i, y_j - x_j) 记下来。这样一共有 n2n ^ 2 个咒语。

    之后枚举子集,判断这 n2n^2 个咒语中最少选出哪些可以满足条件即可。

    因此,时间复杂度为 O(3n2)O(3^{n^2})

    100 分做法

    以样例2为例。为了在每对米奇妙妙屋之间旅行,需要(±1,0)(\pm 1,0),(±2,0)(\pm 2,0),(±3,0)(\pm 3,0),但后两个移动实际上是不必要的,因为可以通过多次重复(±1,0)(\pm 1,0)来实现。

    设 (X,Y)(X,Y) 为从米奇妙妙屋 ii 到米奇妙妙屋 jj 旅行时坐标的变化量。此外,假设 XX 和 YY 都能被 dd 整除。那么,与其记住咒语(X,Y)(X,Y),不如记住(Xd,Yd)(\frac{X}{d},\frac{Y}{d})。

    因此,一旦我们知道了坐标的变化量(X,Y)(X,Y),我们可以将它们除以相同的数字,直到XX和YY不再有大于或等于22的公共因子为止,以确定要记住的咒语。实际上,

    可以通过将XX和YY除以它们的最大公约数(GCD)来找到这个咒语。

    通过以上观察,我们可以证明对于每一对不同的米奇妙妙屋(i,j)(i,j)执行以下操作是最优的。

    考虑从(xi,yi)(x_i,y_i)到(xj,yj)(x_j,y_j)的旅行。

    首先,令X=xj−xiX=x_j−x_i,Y=yj−yiY=y_j−y_i。然后,令g=gcd(X,Y)g=\text{gcd}(X,Y),并将其转化为X←XgX \leftarrow \frac{X}{g},Y←YgY \leftarrow \frac{Y}{g}。最后,记住咒语(X,Y)(X,Y)。

    gcd(X,Y)\text{gcd}(X,Y)的时间复杂度为O(log⁡(max⁡(X,Y)))O(\log(\max(X,Y)))。因此,问题的总时间复杂度为O(N2log⁡(max⁡(X,Y)))O(N^2 \log(\max(X,Y)))。

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    typedef pair < int, int > PII;
    const int SIZE = 5e2 + 5;
    int n;
    map < PII, int > vis;
    struct node {
        int x, y;
    } a[SIZE];
    int main() {
       //freopen("mantra.in", "r", stdin);
        //freopen("mantra.out", "w", stdout);
        cin >> n;
        for (int i = 1; i <= n; ++ i) cin >> a[i].x >> a[i].y;
        int ans = 0;
        for (int i = 1; i <= n; ++ i) {
            for (int j = 1; j <= n; ++ j) {
                if (i == j) continue;
                int x = a[i].x - a[j].x, y = a[i].y - a[j].y;
                int d = __gcd(x,y); d = abs(d);
                x /= d, y /= d;
                if (!vis[(PII) {x, y}]) vis[(PII) {x, y}] = 1, ++ ans;
                	//cout << x << " " << y << endl;
            }
        }
        printf("%lld\n", ans);
        return 0;
    }
    
    • 1

    信息

    ID
    176
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者