萌新求助
查看原帖
萌新求助
522885
童年的小翼龙楼主2023/2/21 14:10

写的可持久化线段树+路径压缩,不明白为什么会Wa,求大佬指点迷津

#include <bits/stdc++.h>
using namespace std;
namespace Slongod{
const int MAXN = 4e6+7;
int n , m , cnt;
//可持久化线段树
int head[MAXN];
struct TREE{int ls , rs , val;}tree[MAXN];
int copyfrom(int ro){cnt++; tree[cnt] = tree[ro]; return cnt;}
int build(int l , int r)
{
    cnt++; int ro = cnt;
    if (l >= r){tree[ro].val = l;}
    else{int mid = (r - l) / 2 + l;
    tree[ro].ls = build(l , mid);
    tree[ro].rs = build(mid+1 , r);}
    return ro;
}
void update(int ro , int lt , int rt , int x , int y)
{
    if (lt >= rt)
    {
        tree[ro].val = y;
        return;
    } int mid = (rt - lt) / 2 + lt;
    if (x <= mid)
        tree[ro].ls = copyfrom(tree[ro].ls) , update(tree[ro].ls , lt , mid , x , y);
    else
        tree[ro].rs = copyfrom(tree[ro].rs) , update(tree[ro].rs , mid+1 , rt , x , y);
}
int find(int ro , int lt , int rt , int x , int root)
{
    if (lt >= rt)
        return tree[ro].val == lt ? lt : tree[ro].val = find(root , 1 , n , tree[ro].val , root);
    int mid = (rt - lt) / 2 + lt;
    if (x <= mid) return find(tree[ro].ls , lt , mid , x , root);
    else return find(tree[ro].rs , mid+1 , rt , x , root);
}
void merge(int x , int y , int root)
{
    int fx = find(root , 1 , n , x , root);
    int fy = find(root , 1 , n , y , root);
    if (fx != fy) update(root , 1 , n , fx , fy);
}
int main()
{
    cin >> n >> m;
    head[0] = build(1 , n);
    for (int i = 1; i <= m; i++)
    {
        int opt; cin >> opt;
        if (opt == 1)
        {
            head[i] = copyfrom(head[i-1]);
            int a , b; cin >> a >> b;
            merge(a , b , head[i]);
        }
        else if (opt == 2)
        {
            int k; cin >> k;
            head[i] = copyfrom(head[k]);
        }
        else
        {
            head[i] = copyfrom(head[i-1]);
            int a , b; cin >> a >> b;
            int fx = find(head[i] , 1 , n , a , head[i]);
            int fy = find(head[i] , 1 , n , b , head[i]);
            if (fx == fy) cout << 1 << '\n';
            else cout << 0 << '\n';
        }
    }
    return 0;
}
}int main()
{
    #ifndef ONLINE_JUDGE
    freopen("P3402_7.in" , "r" , stdin);
    freopen("out.out" , "w" , stdout);
    #endif
    ios :: sync_with_stdio(0);
    cin.tie(0) , cout.tie(0);
    return Slongod :: main();
}
2023/2/21 14:10
加载中...