为什么暴力wa
查看原帖
为什么暴力wa
247343
猪龙骨丶丶楼主2024/7/23 11:00
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> PII;

const int N = 5e4 + 10, INF = 0x3f3f3f3f;

int n, m, d, k;

int F[N];
int f[209][N];
int siz[N];

ll ans=0;
int find(int x, int f[])
{
    if (f[x] == x)return x;
    else return f[x] = find(f[x], f);
}


void merge(int x, int y, int f[])
{
    int xx = find(x, f);
    int yy = find(y, f);
    if (xx > yy)swap(xx, yy);
    f[yy] = xx;
    return;
}


void prin()
{
    cout<<"f"<<endl;
    for (int j = 1;j <= d + 1;j++)
    {
        for (int i = 1;i <= n;i++)
        {
            cout << f[j][i] << " ";
        }
        cout << endl;
    }

    cout<<"F"<<endl;
    for(int i=1;i<=n;i++)
        cout<<F[i]<<" ";
    cout<<endl;
}



ll cal(int x)
{
    ll res = (ll) (x) * (x ) ;
    return res;
}
void solve()
{


    // freopen("1012.in","r",stdin);
    // freopen("1012.out","w",stdout);
    cin >> d  >> n >> k;
    // cout<<"K"<<k<<endl;
    d--;

    int dd=d;
    for (int i = 1;i <= n;i++)
        F[i] = i;

    for (int c = 1;c <= d + 1;c++)
        for (int i = 1;i <= n;i++)
            f[d][i] = i;

    for(int i=1;i<=n;i++)
        siz[i]=0;

    ans = 0;    

    m=0;

    for (int i = 1;i <= m;i++)
    {
        int x, y;
        cin >> x >> y;
        merge(x, y, F);

    }

    for (int j = 1;j <= d + 1;j++)
        for (int i = 1;i <= n;i++)
            f[j][i] = F[i];

    for (int i = 1;i <= n;i++)
        siz[F[i]]++;

 

    ans=n;
    int c=1;
    while (k--)
    {
        // cout<<"ccc"<<c<<endl;
        // c++;
        int x, y, d;
        cin >> x >> y >> d;
        // cout<<"k"<<k<<endl;

        // xx yy d


        int xx = find(x, f[d]);
        int yy = find(y, f[d]);
        if (xx > yy)swap(xx, yy);

        if (xx == yy)
        {
            cout <<ans << endl;
            continue;
        }

        merge(xx, yy, f[d]);
        



        

        int tmp = 1;
        for (int j = 1;j <= dd + 1;j++)
        {
            if(find(x,f[j])==find(y,f[j]) ) continue;
            else
            {
                tmp=0;
                break;
            }
        }


        if (tmp == 1)
        {
            xx=find(x,F),yy=find(y,F);
            merge(x, y, F);
            
            ans = ans - cal(siz[xx]) - cal(siz[yy]) + cal(siz[xx] + siz[yy]);
            siz[xx] += siz[yy];siz[yy] = 0;
             cout <<ans << endl;
        }
        else
             cout <<ans << endl;

        // prin();
    }

    
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int t = 1;
    // cin >> t;
    while (t--) solve();
    return 0;
}
/*
1 1 3 3 
1 1 1 1 
1 1 1 1 

*/
2024/7/23 11:00
加载中...