讨论区所有Hack都过了,数组开的也是卡线的,为什么还会TLE呢
#include <bits/stdc++.h>
#define ms(a, b) memset(a, b, sizeof(a))
using namespace std;
const int Maxn = 4e5 + 5;
struct node
{
int nxt, to, val;
} e[Maxn << 1];
int head[Maxn], cnt = -1;
void add(int u, int v, int w)
{
e[++cnt].to = v;
e[cnt].nxt = head[u];
e[cnt].val = w;
head[u] = cnt;
}
int n, k, ans, root, Tsize;
int siz[Maxn], wt[Maxn];
bool vis[Maxn];
void Getroot(int u, int f)
{
siz[u] = 1, wt[u] = 0;
for (int i = head[u]; ~i; i = e[i].nxt)
{
int v = e[i].to;
if (v != f && !vis[v])
{
Getroot(v, u);
siz[u] += siz[v];
wt[u] = max(wt[u], siz[v]);
}
}
wt[u] = max(wt[u], Tsize - siz[u]);
// cout << u << ' ' << root << endl;
if (wt[root] < wt[u])
root = u;
}
int pos, arr[Maxn];
void dfs1(int u, int count, int f)
{
// cout << 1;
arr[++pos] = count;
for (int i = head[u]; ~i; i = e[i].nxt)
{
int v = e[i].to;
if (v != f && !vis[v])
{
dfs1(v, count + e[i].val, u);
}
}
}
int calc(int u, int count)
{
// cout << 1;
pos = 0, dfs1(u, count, 0);
int l = 1, r = pos, sum = 0;
sort(arr + 1, arr + pos + 1);
for (; l < r;)
{
if (arr[l] + arr[r] <= k)
sum += r - l, l++;
else
r--;
}
return sum;
}
void dfs2(int u)
{
// cout << 1;
ans += calc(u, 0), vis[u] = 1;
for (int i = head[u]; ~i; i = e[i].nxt)
{
int v = e[i].to;
if (!vis[v])
{
ans -= calc(v, e[i].val);
root = 0, Tsize = siz[v], Getroot(v, 0);
dfs2(root);
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin >> n;
ans = 0;
ms(head, -1);
for (int i = 1, u, v, w; i < n; i++)
{
cin >> u >> v >> w;
add(u, v, w);
add(v, u, w);
}
cin >> k;
Getroot(1, 0);
Tsize = n;
// cout << root << endl;
dfs2(root);
cout << ans;
return 0;
}