开了O2从AC变成WA50
查看原帖
开了O2从AC变成WA50
112395
Martin_MHT楼主2021/7/19 16:44

rt,知道自己有undefined behavior但是检查不出来.望大佬帮助。

#include <cstdio>
#include <vector>
#include <algorithm>
#pragma GCC optimize(2)
#define db double
#define fo(i, a, b) for(int i = (a); i <= (b); ++i)
#define fd(i, a, b) for(int i = (a); i >= (b); --i)
#define fv(i, _v) for(int i = 0, siz = _v.size(); i < siz; ++i)
using namespace std;
inline int read() {// negative , long long
	int x = 0; char ch = getchar();
	while(ch < '0' || ch > '9')	ch = getchar();
	while(ch >= '0' && ch <= '9')	x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
	return x;
}
const int N = 5e5;
struct To {
	int v; db w;
	To(){}
	To(int _v, db _w){v = _v, w = _w;}
}; 
vector<To> G[N + 3];
int n, q[N], fa[N];
db ans, p[N + 3], pref[N + 3], val[N + 3], f[N + 3], g[N + 3];
inline db calc(db p, db q){return 1 - (1 - p) * (1 - q);}
void bfs() {
	q[1] = 1;
	for(int h = 1, t = 1; h <= t; ++h) {
		int u = q[h];
		for(vector<To>::iterator it = G[u].begin(); it != G[u].end(); )
			if(it -> v ^ fa[u])
				fa[it -> v] = u, q[++t] = it -> v, ++it;
			else it = G[u].erase(it);
	}
	fd(i, n, 1) {
		int u = q[i];
		fv(i, G[u])	f[u] = calc(f[u], G[u][i].w * f[G[u][i].v]);
	}
	fo(i, 1, n) {
		int u = q[i];
		if(!G[u].size())	continue ;
		fv(i, G[u])
			pref[i + 1] = calc(pref[i], f[G[u][i].v] * G[u][i].w), g[G[u][i].v] = calc(g[u], p[u]);
		db suff = 0;
		for(int i = G[u].size() - 1; ~i; --i)
			g[G[u][i].v] = calc(g[G[u][i].v], calc(pref[i], suff)) * G[u][i].w, suff = calc(suff, f[G[u][i].v] * G[u][i].w);
	}
}
int main() {
//	freopen("charger.in", "r", stdin);
//	freopen("charger.out", "w", stdout);
	n = read();
	int u, v, w;
	fo(i, 2, n)	u = read(), v = read(), w = read(), G[u].push_back(To(v, w * 0.01)), G[v].push_back(To(u, w * 0.01));
	fo(i, 1, n)	f[i] = p[i] = read() * 0.01;
	bfs();
	fo(i, 1, n)	ans += calc(f[i], g[i]);
	printf("%.6lf", ans);
	return 0;
}

2021/7/19 16:44
加载中...