-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhiho112.cpp
109 lines (96 loc) · 2 KB
/
hiho112.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// 最大的误解——以为一定是个链,其实只是个普通的树就行!!!居然忘了这么重要的事情,实在是练习太少了。
// 全换成了longlong试试
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Edge{
long long x;
long long y;
long long l;
};
vector<Edge> edges[100005];
vector<long long> connected[100005];
long long father[100005];
long long sons[100005];
bool v[100005];
long long ans = 0;
void swap(long long &a, long long &b)
{
long long t = a;
a = b;
b = t;
}
long long build_tree(long long x)
{
long long sum = 1;
v[x] = true;
for (size_t i = 0; i < connected[x].size(); ++i) {
long long y = connected[x][i];
if (v[y]) continue;
v[y] = true;
father[y] = x;
sum += build_tree(y);
}
sons[x] = sum;
return sum;
}
long long get_ans(long long x, long long n)
{
long long result = 0;
// 这里没有初始化 似乎出了大问题
ans = 0;
for (size_t i=0; i<edges[x].size(); ++i) {
long long y = edges[x][i].y;
if (father[y] != x) {
continue;
}
long long l = edges[x][i].l;
result += get_ans(y, n);
result += (n - sons[y])*sons[y]*l;
}
return result;
}
void update_ans(long long x, long long y, long long l, long long n)
{
if (father[y] != x) {
swap(x, y);
}
for (size_t i=0; i<edges[x].size(); ++i) {
if (edges[x][i].y == y) {
long long step = l - edges[x][i].l;
ans += step*sons[y]*(n-sons[y]);
edges[x][i].l = l;
break;
}
}
}
int main()
{
long long n, m, x, y;
long long l;
cin >> n >> m;
for (long long i=1; i<n; ++i) {
Edge e = {0};
cin >> x >> y >> l;
connected[x].push_back(y);
connected[y].push_back(x);
e.x = x, e.y = y, e.l = l;
edges[e.x].push_back(e);
e.x = y, e.y = x, e.l = l;
edges[e.x].push_back(e);
}
build_tree(1);
ans = get_ans(1, n);
for (long long i=0; i<m; ++i) {
string s;
cin >> s;
if (s == "QUERY") {
cout << ans << endl;
} else {
cin >> x >> y >> l;
update_ans(x, y, l, n);
}
}
return 0;
}