关于神奇 RE(无限栈)
  • 板块学术版
  • 楼主Walrus
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/1 14:32
  • 上次更新2024/7/1 16:58:26
查看原帖
关于神奇 RE(无限栈)
908424
Walrus楼主2024/7/1 14:32

rt,P4149 在求树的重心时会莫名其妙 RE/MLE,有聪明的同学说是因为没有开无限栈的问题,所以怎么开无限栈防 RE?

#include <bits/stdc++.h>
#define rep(i, j, k) for(int i = j; i <= k; ++i)
#define drep(i, j, k) for(int i = j; i >= k; --i)
#define pb push_back
#define fir first
#define sec second
#define int long long
#define PII pair<int, int>
#define inf 0x3fffffff

using namespace std;
const int N = 2e6 + 5;
const int M = 2e7 + 5;

int dp[N], siz[N], dis[N][2], q[N], c[N][2], a[N], tot, sum, rt, ans, vis[N], mn[M];
int n, m, u, v, w, k;
vector<PII> e[N];

inline void get_rt(int u, int fa) {//<---RE 在这,加 inline 也没用
	dp[u] = 0, siz[u] = 1;
	for(auto ed : e[u]) {
		int v = ed.fir, w = ed.sec;
		if(v == fa || vis[v]) continue;
		get_rt(v, u);
		siz[u] += siz[v];
		dp[u] = max(dp[u], siz[v]);
	}
	dp[u] = max(dp[u], sum - siz[u]);
	if(dp[u] < dp[rt]) rt = u;
}

void get_dis(int u, int fa) {
	c[++tot][0] = dis[u][0], c[tot][1] = dis[u][1];
	for(auto ed : e[u]) {
		int v = ed.fir, w = ed.sec;
		if(vis[v] || v == fa) continue;
		dis[v][0] = dis[u][0] + w;
		dis[v][1] = dis[u][1] + 1;
		get_dis(v, u);
	}
}

void Count(int u) {
	int cnt = 0;
	for(auto ed : e[u]) {
		int v = ed.fir, w = ed.sec;
		if(vis[v]) continue;
		tot = 0, dis[v][0] = w, dis[v][1] = 1, get_dis(v, u);
		rep(i, 1, tot)
			if(k >= c[i][0]) ans = min(ans, mn[k - c[i][0]] + c[i][1]);
		rep(i, 1, tot)
			if(c[i][0] < 1e9) a[++cnt] = c[i][0], mn[c[i][0]] = min(mn[c[i][0]], c[i][1]);
	}
	rep(i, 1, cnt)
		mn[a[i]] = 1e9;
}

void solve(int u) {
	vis[u] = 1, mn[0] = 0, Count(u);
	for(auto ed : e[u]) {
		int v = ed.fir, w = ed.sec;
		if(vis[v]) continue;
		dp[0] = n, rt = 0, sum = siz[v];
		get_rt(v, u), solve(rt);
	}
}



signed main() {
	ios::sync_with_stdio(0);
	cin.tie(nullptr), cout.tie(nullptr);
	
// 	freopen("1.in", "r", stdin);

	memset(mn, 0x3f, sizeof mn);
	
	cin >> n >> k, sum = dp[0] = n, ans = n + 1;
	rep(i, 1, n - 1) cin >> u >> v >> w, ++u, ++v, e[u].pb({v, w}), e[v].pb({u, w});
	
	get_rt(1, 0);
	solve(rt);
	
	cout << (ans <= n ? ans : -1);
	return 0;
} 
2024/7/1 14:32
加载中...