求调个黄数据结构(悬一关)
  • 板块学术版
  • 楼主ShuAkn
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/1/21 17:01
  • 上次更新2025/1/21 19:48:01
查看原帖
求调个黄数据结构(悬一关)
742071
ShuAkn楼主2025/1/21 17:01

代码已过样例但是测试点全wa

题目描述

小C树由 nn 个节点和 n1n - 1 条边构成,节点编号分别为 1,2,...,n1, 2, ..., n,每个节点的初始权值分别为 v1,v2,...,vnv_1, v_2, ..., v_n

随后小C会进行 mm 次操作,操作共分三种:

  • 1 x,删除第 xx 条输入的边;
  • 2 x y,将编号为 xx 的点的权值修改为 yy
  • 3 x,查询编号为 xx 的点所在树的权值之和并输出。

请你编写程序帮助小C计算并输出每次查询的结果。

输入格式

输入的第一行,包含两个整数 n,mn, m,分别表示树中点的数量和操作的次数。

输入的第二行,包含 nn 个整数,其中第 ii 个整数表示树中编号为 ii 的节点的初始权值 viv_i

接下来 n1n - 1 行,每行包含两个整数,表示树中一条边的两个端点。

最后 mm 行,每行依次表示一次操作的信息,具体操作请见题目描述。

输出格式

对于每个查询操作,输出一行包含一个整数,表示查询的结果。

样例 #1

样例输入 #1

2 3
1 1
1 2
2 2 4
1 1
3 2

样例输出 #1

4

提示

1n,m1051 \leq n,m \leq {10}^5

1vi,y10001 \leq v_i, y \leq 1000

所有操作中,点和边的编号保证合法。

#include <bits/stdc++.h>
using namespace std;
#define DEBUG 0
struct Node{
    int father,treevalue,nodevalue;
};
struct Edge{
    int u,v;
};
vector<Node> tree;
vector<Edge> edges;
int findroot(int n){//找根
    if(tree[n].father==0){
        return n;
    }
    return findroot(tree[n].father);
}
void changevalue(int n,int value){//改点权
    tree[n].treevalue+=value;
    if(tree[n].father!=0){
        changevalue(tree[n].father,value);
    }
}
void breakedge(int u,int v){//删边
    changevalue(u,-tree[v].treevalue);
    tree[v].father=0;
}
int sumtree(int n){//求点权和
    if(tree[n].father==0){
        return tree[n].treevalue;
    }
    return sumtree(tree[n].father);
}

int n,m,act,u,v,w;
void rtree(){
    for(int i=1;i<=n;i++){
        cout<<tree[i].father<<" "<<tree[i].treevalue<<" "<<tree[i].nodevalue<<endl;
    }
}
int main(){
    cin>>n>>m;
    tree.resize(n+1);
    edges.resize(n);
    for(int i=1;i<=n;i++){
        cin>>tree[i].nodevalue;
    }
    for(int i=0;i<n-1;i++){
        int a,b;
        cin>>a>>b;
        tree[b].father=a;
        edges.push_back({a,b});
        changevalue(a,tree[b].nodevalue);
    }
    if(DEBUG) rtree();
    for(int i=0;i<m;i++){
        cin>>act;
        
        if(act==1){
            cin>>w;
            u=edges[w].u;
            v=edges[w].v;
            breakedge(u,v);
        }
        else if(act==2){
            cin>>u>>w;
            changevalue(u,w-tree[u].nodevalue);
            tree[u].nodevalue=w;
        }
        else if(act==3){
            cin>>u;
            cout<<sumtree(u)<<endl;
        }
        if(DEBUG) rtree();
    }
    
    return 0;
}
2025/1/21 17:01
加载中...