边权又不会相加,怎么会爆int呢 这份代码过不了,define int long long 才过
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN = 3e5;
int n, m, id[MAXN+5], by[MAXN+5], a[MAXN+5], tp[MAXN+5], len, dp[MAXN+5][30], d[MAXN+5][30], dep[MAXN+5];
vector<int> v[MAXN+5], o[MAXN+5];
struct e{
int x, y, u;
}b[MAXN+5];
bool cmp(e x, e y) {
return x.u>y.u;
}
int find(int x) {
if (tp[x]==x) return x;
return tp[x]=find(tp[x]);
}
void dfs(int i) {
for (int p=1;p<=20;p++) {
dp[i][p] = dp[dp[i][p-1]][p-1];
d[i][p] = min(d[i][p-1], d[dp[i][p-1]][p-1]);
}
for (int p=0;p<v[i].size();p++) {
if (v[i][p]!=dp[i][0]) {
dp[v[i][p]][0] = i;
d[v[i][p]][0] = o[i][p];
dep[v[i][p]] = dep[i]+1;
dfs(v[i][p]);
}
}
return ;
}
int getmin(int x, int y) {
if (dep[x]>dep[y]) swap(x, y);
int u = 2e9;
while (dep[x]!=dep[y]) {
u = min(u, d[y][by[dep[y]-dep[x]]]);
y = dp[y][by[dep[y]-dep[x]]];
}
if (x==y) return u;
for (int p=20;p>=0;p--) {
if (dp[x][p]!=dp[y][p]) {
u = min(u, min(d[x][p], d[y][p]));
x = dp[x][p];
y = dp[y][p];
}
}
u = min(u, min(d[x][0], d[y][0]));
return u;
}
int main() {
//freopen("6.in", "r", stdin);
int q;
scanf("%d %d %d", &n, &m, &q);
for (int p=1;p<=n;p++) {
tp[p] = p;
by[p] = __lg(p);
scanf("%d", &id[p]);
}
tp[n+1] = n+1;
by[n+1] = __lg(n+1);
for (int p=1;p<=n;p++) {
scanf("%d", &a[p]);
}
for (int p=1;p<=m;p++) {
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
b[++len] = {x, y, z};
}
for (int p=1;p<=q;p++) {
int i;
scanf("%d", &i);
b[++len] = {n+1, i, 2000000000};
}
stable_sort(b+1, b+len+1, cmp);
for (int p=1;p<=len;p++) {
int u1 = find(b[p].x), u2 = find(b[p].y);
if (u1!=u2) {
tp[u1] = u2;
v[b[p].x].push_back(b[p].y);
o[b[p].x].push_back(b[p].u);
v[b[p].y].push_back(b[p].x);
o[b[p].y].push_back(b[p].u);
}
}
dfs(1);
ll now = 0;
for (int p=1;p<=n;p++) {
if (a[id[p]]<0) {
printf("%lld\n", min(now, 1ll*(-a[id[p]])));
now-=min(now, 1ll*(-a[id[p]]));
}
else now+=a[id[p]];
now = min(now, 1ll*getmin(id[p], id[p+1]));
}
return 0;
}