社区讨论

全WA, 求调

P2491[SDOI2011] 消防参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lomn02zl
此快照首次捕获于
2023/11/06 16:25
2 年前
此快照最后确认于
2023/11/06 19:41
2 年前
查看原帖
CPP
//
// Created by lndff on 2023.11.06
//
#include <bits/stdc++.h>
using namespace std;

template <typename T> inline void read(T &x){
	int w = 1;x = 0;char s;
	while (!isdigit(s = getchar())) if (s == '-') w = -1;
	while (isdigit(s)) x = (x << 3) + (x << 1), x += s - '0', s = getchar();
	x *= w;
}

const int N = 3e5 + 10;
int n, s, l1, point1;
vector<pair<int, int>> ver[N];
bool check[N];
int d[N], L[N], R[N];
void add(int u, int v, int w){
	ver[u].push_back(make_pair(v, w));
}
vector<int>dd;
unordered_map<int, int>hax[N];
int dfs1(int x, int fa, int step){
	if (ver[x].size() == 1 && ver[x][0].first == fa){
		if (step > l1){
			point1 = x;
			l1 = step;
			dd.clear();
			dd.push_back(x);
			return 1;
		}
		return 0;
	}
	int tag = 0;
	for (auto i : ver[x]){
		int v = i.first, w = i.second;
		if (v != fa){
			if(dfs1(v, x, step + w)) dd.push_back(x), tag = 1;
		}
	}
	return tag;
}

int dfs2(int x, int fa, int step){
	int ans = 0;
	for (auto i : ver[x]){
		int v = i.first, w = i.second;
		if (v != fa && !check[v]){
			ans = max(ans, dfs2(v, x, step + w));
		}
		if (v != fa && check[v]) hax[x].insert(make_pair(v, w));
	}
	return ans;
}

int main(){
	read(n);read(s);
	for (int i = 1, u, v, w; i < n; read(u), read(v), read(w), add(u, v, w), add(v, u, w), i++);
	dfs1(1, 0, 0);
	dfs1(point1, 0, 0);
	for (auto i : dd) check[i] = 1;
	for (auto i : dd) d[i] = dfs2(i, 0, 0); 
	deque<pair<int, int>> dq;
	deque<pair<int, int>> dq_;
	for (int i = 1; i < int(dd.size()); i++){
		L[i] = L[i - 1] + hax[dd[i]][dd[i - 1]];
	}
	for (int i = dd.size() - 2; i >= 0; i--){
		R[i] = R[i + 1] + hax[dd[i]][dd[i + 1]];
	}
	int ans = 0x3f3f3f3f;
	int l = 0, ddd = 0;
	for (int i = 0; i < int(dd.size()); i++){
		ddd = L[i] - L[l];
		while (ddd > s){
			l++;
			ddd = L[i] - L[l];
		}
		while (!dq_.empty() && dq_.back().first < d[dd[i]]) dq_.pop_back();
		dq_.push_back({d[dd[i]], i});
		// if (l == i) continue;
		while(!dq_.empty() && dq_.front().second < l) dq_.pop_front();
		ans = min(max(dq_.front().first, max(L[l], R[i])), ans);
	}
	cout << ans;
}
过了样例, 但答案输出全是0

回复

0 条回复,欢迎继续交流。

正在加载回复...