P7186 [CRCI2008-2009] TABLICA 题解

· · 题解

如果你是这么想的,恭喜你 MLE 了 (bushi

本题的空间复杂度为 \color{red}O(n^2) ,又注意到空间仅有 32MB ,显然是过不了的。

那我们再进一步思考:

但是!!!!

它找到下一个点时间复杂度是 O(kn^2)……(悲

那,怎么办?

仔细想一想,在之前的过程中,我们都将思维局限于在线算法,我们不妨尝试一下离线算法。

时间复杂度 O(k^2),空间复杂度 O(k),非常优雅的过掉了这道题

最后奉上 AC 代码

#include<bits/stdc++.h>
using namespace std;
pair<int,int>a[1005];
int n,k,x,r[1005],c[1005];
int main()
{
    return 0;//防止抄题解
    ios::sync_with_stdio(false);
    cin.tie(NULL),cout.tie(NULL); //输入优化
    cin>>n>>k;
    for(int i=1;i<=k;i++)
    {
        cin>>x>>r[i]>>c[i];
        if(x%n)a[i]={x/n+1,x%n};
        else a[i]={x/n,n};
    }
    #define x first
    #define y second //打起来方便
    for(int i=1;i<=k;i++)
    {
        int m=((c[i]<a[i].y)?(n-a[i].y+c[i]):(c[i]-a[i].y));
        for(int j=i+1;j<=k;j++)
            if(a[i].x==a[j].x)
            {
                a[j].y=a[j].y+m;
                a[j].y-=(a[j].y>n)*n;
            }
        int s=((r[i]<a[i].x)?(n-a[i].x+r[i]):(r[i]-a[i].x));
        for(int j=i+1;j<=k;j++)
            if(c[i]==a[j].y)
            {
                a[j].x=a[j].x+s;
                a[j].x-=(a[j].x>n)*n;
            }
        cout<<m+s<<'\n';
    }
    return 0;
}

蒟蒻第一篇题解,求过 qwq