double 和 float 的区别??
查看原帖
double 和 float 的区别??
90027
fanypcd楼主2022/7/1 09:00

这题,原来用的 double,然后被卡常了 TLE 2 个点,就想着精度没必要那么高换成了 float 结果全部 TLE(本地测样例是没问题的,memset 的初值设置也检查过)。

求救

#include<bits/stdc++.h>
using namespace std;
template<class T> inline void read(T &x) {
	x = 0;
	int f = 0;
	char ch = getchar();
	while(ch < '0' || ch > '9') {
		f |= ch == '-';
		ch = getchar();
	}
	while('0' <= ch && ch <= '9') {
		x = x * 10 + (ch - 48);
		ch = getchar();
	}
	x = f ? -x : x;
	return;
}
#define inf 0x3f3f3f3f
#define ll long long
#define N 100005
int n, L, R;
int first[N], Next[N << 1], to[N << 1], w[N << 1], tot;
inline void add(int x, int y, int z) {Next[++tot] = first[x], first[x] = tot, to[tot] = y, w[tot] = z; return;}
int size[N], ban[N], vis[N], sum, rt;
void getroot(int u, int pre) {
	size[u] = 1, ban[u] = 0;
	for(int i = first[u]; i; i = Next[i]) {
		int v = to[i];
		if(v == pre || vis[v]) continue;
		getroot(v, u), size[u] += size[v];
		ban[u] = max(ban[u], size[v]);
	}
	ban[u] = max(ban[u], sum - size[u]);
	if(ban[u] < ban[rt]) rt = u;
	return;
}
vector<pair<int, pair<int, int>>> ch[N];
#define fir first
#define sec second
bool flag;
float midval, rd[N], memrd[N];
int q[N], st, ed, stq, edq, sumsize;
pair<pair<int, int>, pair<int, float>> que[N];
void bfs(int x, float vv) {
	stq = 1, edq = 0; que[++edq] = {{x, 0}, {1, vv}};
	while(stq <= edq) {
		auto x = que[stq++];
		int u = x.fir.fir, pre = x.fir.sec, len = x.sec.fir; float sum = x.sec.sec;
		if(sum > rd[len]) rd[len] = sum;
		while(st <= ed && q[st] > R - len) st++;
		if(L - len >= 0 && L - len <= sumsize) {
			while(st <= ed && memrd[q[ed]] <= memrd[L - len]) ed--;
			q[++ed] = L - len;
		}
		if(st <= ed && sum + memrd[q[st]] >= 0) {flag = 1; return;}
		for(int i = first[u]; i; i = Next[i]) {
			int v = to[i];
			if(vis[v] || v == pre) continue;
			que[++edq] = {{v, u}, {len + 1, sum + (float)w[i] - midval}};
		}
	}
	return;
}
void solve(int u) {
	vis[u] = 1, getroot(u, 0);
	if(ch[u].empty()) {
		for(int i = first[u]; i; i = Next[i]) {
			int v = to[i];
			if(vis[v]) continue;
			ch[u].emplace_back(make_pair(size[v], make_pair(v, w[i])));
		}
		sort(ch[u].begin(), ch[u].end());
	}
	memset(rd, -0x1f, sizeof(float) * (size[u] + 1));
 	rd[0] = 0;
	st = 1, ed = 0;
	for(auto x : ch[u]) {
		int v = x.sec.fir;
		sumsize = size[v];
		memcpy(memrd, rd, sizeof(float) * (size[v] + 1));
		bfs(v, (float)x.sec.sec - midval);
		if(flag) return;
		st = 1, ed = 0;
		for(int i = min(R, size[v]); i >= L; i--) {
			while(st <= ed && rd[q[ed]] <= rd[i]) ed--;
			q[++ed] = i;
		}
	}
	for(int i = first[u]; i; i = Next[i]) {
		int v = to[i];
		if(vis[v]) continue;
		sum = size[v], getroot(v, rt = 0);
		solve(rt);
		if(flag) return;
	}
	return;
}
signed main() {
	read(n), read(L), read(R);
	int x, y, z;
	float l = 1e6, r = 0;
	for(int i = 1; i < n; i++) read(x), read(y), read(z), l = min(l, (float)z), r = max(r, (float)z), add(x, y, z), add(y, x, z);
	ban[0] = inf;
	float mid;
	while(r - l > 1e-4) {
		mid = (l + r) / 2;
		memset(vis, 0, sizeof(vis));
		midval = mid, flag = 0;
		sum = n, getroot(1, rt = 0), solve(rt);
		if(flag) l = mid;
		else r = mid;
	}
	printf("%0.3f", l);
	return 0;
}
2022/7/1 09:00
加载中...