题解 P1289 【磁盘碎片整理】

· · 题解

既然没有写并差集的

那我就来一篇

w意思是移动到第几个储存块

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
using namespace std;
int f[100005];
int find(int x)
{
    if (f[x]==x) return f[x];
    return f[x]=find(f[x]);
}
int main()
{
    int i,j,n,k,w=0,x,ans=0,t;
    scanf ("%d%d",&n,&k);
    for (i=1; i<=n; i++) f[i]=i;
    for (i=1; i<=k; i++)
    {
        scanf ("%d",&t);
        for (j=1; j<=t; j++)
        {
            w++;
            scanf ("%d",&x);
            if(w!=x)//如果该内容不在指定位置
            {
                int p1=find(w);
                int p2=find(x);//并差集
                if (p1==p2) ans+=2;
                else
                {
                    ans++;
                    f[p1]=f[p2];
                }
            }
        }
    }
    if (ans>0) printf ("We need %d move operations.\n",ans);
    else printf ("No optimization needed.\n");
    return 0;
}