求助树剖RE
查看原帖
求助树剖RE
526519
Aisaka_Taiga楼主2023/8/28 09:52

在进行C操作的时候会卡住,求助。

/*
 * @Author: Aisaka_Taiga
 * @Date: 2023-08-28 08:56:05
 * @LastEditTime: 2023-08-28 09:46:47
 * @LastEditors: Aisaka_Taiga
 * @FilePath: \Desktop\P3950.cpp
 * 心比天高,命比纸薄。
 */
#include <bits/stdc++.h>

// #define int long long
#define rs (x << 1 | 1)
#define ls (x << 1)
#define N 300100

using namespace std;

inline int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){f=ch!='-';ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return f?x:-x;}

struct node1{int v, next;} e[N << 1];
struct node2{int len, tag, sum;} t[N << 2];
int n, m, dfn[N], pre[N], siz[N], f[N], top[N], dep[N], son[N], cnt, tim, head[N];
int U[N], V[N], tot;

inline void add(int u, int v){e[++ cnt] = (node1){v, head[u]}; head[u] = cnt;}

inline void p_p(int x){t[x].sum = t[ls].sum + t[rs].sum;}

void dfs1(int x, int fa)
{
    f[x] = fa;
    siz[x] = 1;
    dep[x] = dep[fa] + 1;
    for(int i = head[i]; i; i = e[i].next)
    {
        int v = e[i].v;
        if(v == fa) continue;
        dfs1(v, x);
        if(siz[v] > siz[son[x]]) son[x] = v;
        siz[x] += siz[v];
    }
    return ;
}

void dfs2(int x, int tp)
{
    top[x] = tp;
    dfn[x] = ++ tim;
    pre[tim] = x;
    if(!son[x]) return ;
    dfs2(son[x], tp);
    for(int i = head[x]; i; i = e[i].next)
    {
        int v = e[i].v;
        if(v == f[x] || v == son[x]) continue;
        dfs2(v, v);
    }
    return ;
}

inline void build(int x, int l, int r)
{
    t[x].len = r - l + 1;
    if(l == r) return ;
    int mid = l + r >> 1;
    build(ls, l, mid);
    build(rs, mid + 1, r);
    return ;
}

inline void p_d(int x)
{
    if(t[x].tag == 0) return ;
    t[ls].tag += t[x].tag;
    t[rs].tag += t[x].tag;
    t[ls].sum += t[ls].len * t[x].tag;
    t[rs].sum += t[rs].len * t[x].tag;
    t[x].tag = 0;
    return ;
}

inline void add(int x, int l, int r, int nl, int nr, int v)
{
    if(nl <= l && r <= nr)
    {
        t[x].sum += t[x].len * v;
        t[x].tag += v;
        return ;
    }
    p_d(x);
    int mid = l + r >> 1;
    if(mid >= nl) add(ls, l, mid, nl, nr, v);
    if(mid < nr) add(rs, mid + 1, r, nl, nr, v);
    p_p(x);
    return ;
}

inline void Add(int x, int y, int  v)
{
	int top1 = top[x], top2 = top[y];
	while(top1 != top2)
	{
		if(dep[top1]<dep[top2]) swap(top1, top2), swap(x, y);
		add(1, 1, n, dfn[top1], dfn[x], v);
		x = f[top1], top1 = top[x];
	}
	if(dep[x] > dep[y]) swap(x, y);
	add(1, 1, n, dfn[x] + 1, dfn[y], v);
    return ;
}

inline int ask(int x, int l, int r, int nl, int nr)
{
    int res = 0;
    if(nl <= l && r <= nr) return t[x].sum;
    int mid = l + r >> 1;
    p_d(x);
    if(nl <= mid) res += ask(ls, l, mid, nl, nr);
    if(nr > mid) res += ask(rs, mid + 1, r, nl, nr);
    return res;
}

inline int Ask(int x, int y)
{
    int top1 = top[x], top2 = top[y], res = 0;
    while(top1 != top2)
    {
        if(dep[top1] < dep[top2]) swap(top1, top2), swap(x, y);
        res += ask(1, 1, n, dfn[top1], dfn[x]);
        x = f[top1], top1 = top[x];
    }
    if(dep[x] < dep[y]) swap(x, y);
    res += ask(1, 1, n, dfn[y] + 1, dfn[x]);
    return res;
}

signed main()
{
    n = read(), m = read();
    for(int i = 1; i <= n - 1; i ++)
    {
        int u = read(), v = read();
        add(u, v);
        add(v, u);
    }
    dfs1(1, 0);
    dfs2(1, 1);
    build(1, 1, n);
    for(int i = 1; i <= m; i ++)
    {
        int x, y;
        char op;
        cin >> op;
        // cout << "CAO" << endl;
        if(op == 'C') tot ++, U[tot] = read(), V[tot] = read(), Add(U[tot], V[tot], 1);
        if(op == 'Q') x = read(), y = read(), cout << (Ask(x, y) >= 1 ? "No" : "Yes") << endl;
        if(op == 'U') x = read(), Add(U[x], V[x], -1);
    }
    return 0;
}
2023/8/28 09:52
加载中...