全部RE?!样例已过,请大佬调一调,玄3关,急!
查看原帖
全部RE?!样例已过,请大佬调一调,玄3关,急!
775893
OIDragon楼主2024/1/23 16:24

code:code:

#include <bits/stdc++.h>
using namespace std;
vector<int> ex[1000005];
int n,m;
struct tree
{
    int l,r,s;
}e[1000005];
tree merge(tree a,tree b)
{
    tree c;
    c.s = a.s + b.s;
    if(b.l == a.r)
    {
        c.s--;
    }
    c.l = a.l;
    c.r = b.r;
    return c;
}
int tot,tag[1000005],w[1000005],idx[1000005],fa[1000005],dp[1000005],len[1000005],son[1000005],topf[1000005],fe[1000005],usd[1000005];
void pd(int rt,int l,int r)
{
    if(fe[rt] == 0)
	{
        return;
    }
    e[rt].l = tag[rt];
    e[rt].r = tag[rt];
    e[rt].s = 1;
    tag[rt * 2] = tag[rt];
    tag[rt * 2 + 1] = tag[rt];
    tag[rt] = 0;
    fe[rt * 2] = 1;
    fe[rt * 2 + 1] = 1;
    fe[rt] = 0;
}
void pu(int rt,int l,int r)
{
	int mid = (l + r) / 2;
    pd(rt,l,r);
    pd(rt * 2,l,mid);
    pd(rt * 2 + 1,mid + 1,r);
    e[rt] = merge(e[rt * 2],e[rt * 2 + 1]);
}
void ud(int rt,int l,int r,int lx,int rx,int v)
{
	int mid = (l + r) / 2;
    pd(rt,l,r);
    if(lx <= l && r <= rx)
	{
        fe[rt] = 1;
        tag[rt] = v;
        return;
    }
    if(lx <= mid)
	{
        ud(rt * 2,l,mid,lx,rx,v);
    }
    if(rx > mid)
	{
        ud(rt * 2 + 1,mid + 1,r,lx,rx,v);
    }
    pu(rt,l,r);
}
tree query(int rt,int l,int r,int lx,int rx)
{
	int mid = (l + r) / 2;
    pd(rt,l,r);
    if(lx <= l && r <= rx)
	{
        return e[rt];
    }
	else if(lx > mid)
	{
        return query(rt * 2 + 1,mid + 1,r,lx,rx);
    }
	else if(rx <= mid)
	{
        return query(rt * 2,l,mid,lx,rx);
    }
	else
	{
        return merge(query(rt * 2,l,mid,lx,rx),query(rt * 2 + 1,mid + 1,r,lx,rx));
    }
}
void udr(int x,int y,int z)
{
    while(topf[x] != topf[y])
	{
        int fx = topf[x],fy = topf[y];
        if(dp[fx] < dp[fy])
		{
            swap(fx,fy);
            swap(x,y);
        }
        ud(1,1,n,idx[fx],idx[x],z);
        x = fa[fx];
    }
    if(dp[x] < dp[y])
	{
        swap(x,y);
    }
    ud(1,1,n,idx[y],idx[x],z);
}
int queryr(int x,int y)
{
    int ans = 0,as,st;
    as = -1;
	st = -1;
    while(topf[x] != topf[y])
	{
        int fx = topf[x],fy = topf[y];
        if(dp[fx] < dp[fy])
		{
            swap(fx,fy);
            swap(x,y);
            swap(as,st);
        }
        tree t = query(1,1,n,idx[fx],idx[x]);
        ans += t.s;
        if(t.r == as)
		{
            ans--;
        }
        as = t.l;
        x = fa[fx];
    }
    if(dp[x] < dp[y])
	{
        swap(x,y);
        swap(as,st);
    }
    tree t = query(1,1,n,idx[y],idx[x]);
    ans += t.s;
    if(t.r == as)
	{
        ans--;
    }
    if(t.l == st)
	{
        ans--;
    }
    return ans;
}
void dfs1(int u,int f,int dep)
{
    dp[u] = dep;
    fa[u] = f;
    len[u] = 1;
    for(int i = 0;i <= ex[u].size() - 1;i++)
	{
        int v = ex[u][i];
        if(f == v)
		{
            continue;
        }
        dfs1(v,u,dep + 1);
        len[u] += len[v];
        if(len[son[u] < len[v]])
		{
            son[u] = v;
        }
    }
}
void dfs2(int u,int f)
{
    if(u == 0)
	{
        return;
    }
    topf[u] = f;
    usd[u] = 1;
    idx[u] = ++tot;
    dfs2(son[u],f);
    for(int i = 0;i <= ex[u].size() - 1;i++)
	{
        int v = ex[u][i];
        if(usd[v] != 0)
		{
            continue;
        }
        dfs2(v,v);
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= n;i++)
	{
        scanf("%d",&w[i]);
    }
    for(int i = 1;i <= n - 1;i++)
	{
        int u,v;
        scanf("%d%d",&u,&v);
        ex[u].push_back(v);
        ex[v].push_back(u);
    }
    dfs1(1,0,1);
    dfs2(1,1);
    for(int i = 1;i <= n;i++)
	{
        ud(1,1,n,idx[i],idx[i],w[i]);
    }
    for(int i = 1;i <= m;i++)
	{
        char ch;
        int a,b,c;
        getchar();
        scanf("%c",&ch);
        if(ch == 'C')
		{
            scanf("%d%d%d",&a,&b,&c);
            udr(a,b,c);
        }
		else
		{
            scanf("%d%d",&a,&b);
            printf("%d\n",queryr(a,b));
        }
    }
    return 0;
}

拜谢大佬,蒟蒻不懂为啥会RE……

求路过的大佬康康吧

别刷灌水了,帮帮我吧

2024/1/23 16:24
加载中...