社区讨论
全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 条回复,欢迎继续交流。
正在加载回复...