1 条题解

  • 1
    @ 2026-3-12 0:16:20

    emmmemmm

    其实就是个带权并查集喵其实就是个带权并查集喵

    #pragma GCC optimize("Ofast")
    #pragma GCC optimize("unroll-loops")
    /*
    @ mch
    @ Mar
    @ problem from:[NOI2002] 银河英雄传说
    */
    #include <bits/stdc++.h>
    using namespace std;
    typedef signed long long s64;
    using u32 = unsigned int;
    using u64 = unsigned long long;
    #define lod long double
    #define int long long
    #define FastIO ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    #define PII pair<int,int>
    #ifdef __linux__
    #define gc getchar
    #define pc putchar
    #endif
    #define bdy 30000
    #define rep(i,n) for(int i = 1;i <= n;++i)
    #define rep2(j,i) for (int j = i - 1; j >= 1; --j)
    #define debug(x) cout << #x << " : " << x << "\n";
    #define debug2(x,y) cout << #x << " : " << x << " " << #y << " : " << y << "\n";
    const int N = 3e4+5;
    int father[N];
    int size1[N], d[N];
    int find(int x)
    {
    	if (x == father[x])
    		return x;
    	int root = find(father[x]);
    	d[x] = d[x] + d[father[x]];
    	father[x] = root;
    	return father[x];
    }
    
    void merge(int a, int b)
    {
    	a = find(a), b = find(b);
    	d[a] = size1[b];
    	size1[b] += size1[a];
    	father[a] = b;
    }
    void solve(void)
    {
    	[&](void) -> void {
    		int t;
    		cin >> t;
    		for (int i = 1; i <= bdy; ++i)
    			father[i] = i, size1[i] = 1;
    		while (t--)
    		{
    			char c;
    			int x, y;
    			cin >> c >> x >> y;
    			if (c == 'M') {
    				merge(x, y);
    			} else {
    				int a = find(x);
    				int b = find(y);
    				if (a == b) {
    					cout << max(abs(d[x] - d[y] ) - 1, 0LL) << '\n';
    				} else
    					cout<<-1<<'\n';
    			}
    		}
    	}();
    }
    void Freopen(void)
    {
    	freopen("IO.in", "r", stdin);
    	freopen("IO.out", "w", stdout);
    }
    signed main(void)
    {
    	FastIO;
    	//Freopen();
    	setvbuf(stdin, NULL, _IOFBF, 1 << 25);
    	setvbuf(stdout, NULL, _IOFBF, 1 << 25);
    	// cout<<fixed<<setprecision(10);
    	int t__ = 1;
    	//cin>>t__;
    	while (t__--)
    		solve();
    	return 0;
    }
    
    • 1

    信息

    ID
    5317
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    157
    已通过
    47
    上传者