nlogn^2 tle 求救
查看原帖
nlogn^2 tle 求救
533665
lefthand166楼主2024/10/26 11:58
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
long long a[maxn], b[maxn], c[maxn];
vector<int> child[maxn];
int fa[maxn];
int n;
bool culc(int x, int i, int t) {
    if (c[i] >= 0) {
        return (t - x + 1) * 1.0 / a[i] * (2 * b[i] + x * c[i] + t * c[i]) / 2 >= 1;
    } else {
        int dt = ceil((b[i] - 1) * 1.0 / -c[i]);
        if (dt <= x) return (t - x + 1) >= a[i];
        else if(dt <= t) return (t - dt + 1) * 1.0 / a[i] + (dt - x) * 1.0 / a[i] * (b[i] + x * c[i] + b[i] + (dt - 1) * c[i]) / 2.0 >= 0.9999999;
        else return (t - x + 1) * 1.0 / a[i] * (2 * b[i] + x * c[i] + t * c[i]) / 2 >= 1;
    }
}
pair<int, int> need[maxn];
int ne[maxn];
bool ok[maxn];
int st[maxn];
bool check(int t) {
    ok[0] = 1;
    for (int i = 1; i <= n; i++) {
        need[i].second = i;
        int l = 1, r = t;
        while (r - l > 1) {
            int mid = floor((l + r) / 2.0);
            if (culc(mid, i, t)) l = mid;
            else r = mid;
        }
        need[i].first = l;
        if (culc(r, i, t)) need[i].first = r;
        ok[i] = 0;
        ne[i] = need[i].first;
    }
    // cout << t << ":\n";
    // for (int i = 1; i <= n; i++) {
    //     cout << need[i].first << " ";
    // }
    // cout << "\n";
    sort(need + 1, need + 1 + n);
    for (int i = 1, k = 0; i <= n; i++) {
        int p = need[i].second;
        int sum = 0;
        while (!ok[p]) {
            st[++sum] = ne[p];
            ok[p] = 1;
            p = fa[p];
        }
        while (sum) {
            if (st[sum--] < ++k) return false;
        }
    }
    return true;
}
void dfs(int pa, int p) {
    fa[p] = pa;
    for (int u : child[p]) {
        if (u == pa) continue;
        dfs(p, u);
    }
}
signed main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%lld%d%d", &a[i], &b[i], &c[i]);
    for (int i = 1; i < n; i++) {
        int u, v;
        scanf("%d%d", &u, &v);
        child[u].push_back(v);
        child[v].push_back(u);
    }
    dfs(0, 1);
    int l = 0, r = 1e9;
    while (r - l > 1) {
        // cout << l << " " << r << "lllrrrr\n";
        int mid = (l + r) / 2;
        if (check(mid)) r = mid;
        else l = mid;
    }
    // cout << l << " " << r << "lllllrrrrr\n";
    int ans = r;
    if (check(l)) ans = l;
    cout << ans << "\n";
}

2024/10/26 11:58
加载中...