为什么这个题INF开到1e9会挂?
查看原帖
为什么这个题INF开到1e9会挂?
383782
StarPatrick楼主2023/10/9 16:42

边权又不会相加,怎么会爆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;
}
2023/10/9 16:42
加载中...