萌新初学左偏树,全wa,求调,给关注
查看原帖
萌新初学左偏树,全wa,求调,给关注
685127
MaLX楼主2022/3/4 18:27
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#include <vector>
const int ni = 2e6;
int n, m;
struct knight {
    int c, i, die;
    long long s;
    int l, r, f, dist;
    long long mul, add, dea;
} kn[ni];
struct city {
    long long h, v;
    int f, a, rt, die;
} ct[ni];
vector<int> touch[ni], son[ni];
void solve();
int add(int a, int b);
void pushdown(int a);
int main() {
    solve();
    return 0;
}
void solve() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) scanf("%lld", &ct[i].h);
    for (int i = 2; i <= n; i++) {
        int a, b;
        long long c;
        scanf("%d%d%lld", &a, &b, &c);
        ct[i].f = a;
        ct[i].a = b;
        ct[i].v = c;
        son[a].push_back(i);
    }
    for (int i = 1; i <= m; i++) {
        long long a;
        int b;
        scanf("%lld%d", &a, &b);
        kn[i].s = a;
        kn[i].c = b;
        kn[i].i = i;
        kn[i].mul = 0;
        touch[b].push_back(i);
    }
    // printf("ggbond");
    for (int g = n; g >= 1; g--) {
        // printf("--- %d ---\n",g);
        int &rt = ct[g].rt;
        city &u = ct[g];
        for (int j : touch[g]) rt = add(rt, j);
        for (int j : son[g]) rt = add(rt, ct[j].rt);
        // printf("[%d %lld %d %lld]",rt,v.s,u.a,u.v);
        // printf("[%d %lld %lld]\n",rt,kn[rt].s,u.h);
        while (rt && u.h > kn[rt].s) {
            // printf("<- %lld ->",kn[rt].s);
            rt = add(kn[rt].l, kn[rt].r);
            u.die++;
            // printf("[%d %lld %lld]\n",rt,kn[rt].s,u.h);
        }
        knight &v = kn[rt];
        v.die++;
        v.dea++;
        if (u.a == 0)
            v.add += u.v, v.s += u.v;
        else
            v.add *= u.v, v.mul *= u.v, v.s *= u.v;
        pushdown(rt);
    }
    for (int i = 1; i <= n; i++) printf("%d\n", ct[i].die);
    for (int i = 1; i <= m; i++) printf("%d\n", kn[i].die);
}
int add(int a, int b) {
    // printf("<%d %d>\n",a,b);
    if (a == 0 || b == 0)
        return a + b;
    pushdown(a);
    pushdown(b);
    if (kn[a].s > kn[b].s) {
        int c = a;
        a = b;
        b = c;
    }
    knight &u = kn[a];
    u.r = add(u.r, b);
    if (kn[u.l].dist < kn[u.r].dist) {
        int z = u.l;
        u.l = u.r;
        u.r = z;
    }
    u.dist = kn[u.r].dist + 1;
    return a;
}
void pushdown(int a) {
    knight &u = kn[a];
    if (u.mul == 1 && u.add == 0)
        return;
    knight &l = kn[u.l], &r = kn[u.r];
    l.dea += u.dea;
    l.die += u.dea;
    r.dea += u.dea;
    r.die += u.dea;
    l.add *= u.mul;
    l.add += u.add;
    r.add *= u.mul;
    r.add += u.add;
    l.s *= u.mul;
    l.mul *= u.mul;
    r.s *= u.mul;
    r.mul *= u.mul;
    l.s += u.add;
    r.s += u.add;
    u.add = 0, u.mul = 1, u.dea = 0;
}
2022/3/4 18:27
加载中...