50poitnsTLE求调
  • 板块P4178 Tree
  • 楼主shujingnuli
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/2/8 00:39
  • 上次更新2025/2/8 11:06:33
查看原帖
50poitnsTLE求调
1079004
shujingnuli楼主2025/2/8 00:39

讨论区所有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;
}
2025/2/8 00:39
加载中...