RE7 TLE9 求调 过了变猫娘(bushi)
查看原帖
RE7 TLE9 求调 过了变猫娘(bushi)
1601338
chenzhiyou12楼主2025/7/29 00:11
#include <bits/stdc++.h>
#define ll long long
#define db double
#define vi vector<int>
#define pb push_back
#define For(i, j, k) for (int i = j; i <= k; ++ i)
#define Rof(i, j, k) for (int i = j; i >= k; -- i)
using namespace std;
const int N = 1e4 + 10, M = 110, N1 = 1e7 + 10;
struct edge {
    int v, w;
};
int n, m, q[N], p[N], qry[M];
bool st[N], qa[M], st1[N1];
vector<edge> g[N];
int get_siz(int u, int fa) {
    if (st[u]) {
        return 0;
    }
    int ret = 1;
    for (auto [v, w] : g[u]) {
        if (v == fa) {
            continue;
        }
        ret += get_siz(v, u);
    }
    return ret;
}
int get_c(int u, int fa, int siz, int &w) {
    if (st[u]) {
        return 0;
    }
    int s = 1, maxn = 0;
    for (auto [v, w] : g[u]) {
        if (v == fa) {
            continue;
        }
        int t = get_c(v, u, siz, w);
        maxn = max(maxn, t);
        s += t;
    }
    maxn = max(maxn, siz - s);
    if (maxn <= n / 2) {
        w = u;
    }
    return s;
}
void get_dist(int u, int fa, int dis, int &qt) {
    if (st[u]) {
        return ;
    }
    q[++ qt] = dis;
    for (auto [v, w] : g[u]) {
        if (v == fa) {
            continue;
        }
        get_dist(v, u, dis + w, qt);
    }
}
void calc(int u) {
    if (st[u]) {
        return ;
    }
    get_c(u, -1, get_siz(u, -1), u);
    // cout << u << '\n';
    st[u] = true;
    int pt = 0;
    st1[0] = true;
    for (auto [v, w] : g[u]) {
        int qt = 1;
        q[qt] = w;
        get_dist(v, -1, w, qt);
        For (i, 1, qt) {
            // cout << q[i] << ',';
            For (j, 1, m) {
                if (qry[j] >= q[i]) {
                    qa[j] |= st1[qry[j] - q[i]];
                }
            }
        }
        For (i, 1, qt) {
            p[ ++ pt] = q[i];
            st1[q[i]] = true;
        }
    }
    For (i, 1, pt) {
        st1[p[i]] = false;
    }
    for (auto [v, w] : g[u]) {
        calc(v);
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(NULL);
    cin >> n >> m;
    For (i, 1, n - 1) {
        int u, v, w;
        cin >> u >> v >> w;
        g[u].pb({v, w}), g[v].pb({u, w});
    }
    For (i, 1, m) {
        cin >> qry[i];
    }
    calc(1);
    For (i, 1, m) {
        cout << (qa[i] ? "AYE" : "NAY") << '\n';
    }
    return 0;
}

求助QwQ

2025/7/29 00:11
加载中...