求 hack
查看原帖
求 hack
551861
strcmp楼主2023/12/26 19:35

rt。

A #2,#5...#10,其余全部 WA。

#include <bits/stdc++.h>
using namespace std;
typedef double ld;
typedef long long int ll;
using pll = pair<ll, ll>;
const int maxn = 4e5 + 10;
const ll inf = 123456789123456789LL;
struct seg {
    ll k, b;
    seg() { k = 0, b = inf; }
    seg(ll K, ll B) { k = K, b = B; }
    inline ll f(ll x) {
        return k * x + b;
    }
} S[maxn]; int n;
int dep[maxn], siz[maxn], top[maxn], son[maxn], dfn[maxn], td[maxn], fa[maxn], dct = 0; ll dist[maxn];
#define w(x, y) S[x].f(y) 
struct Node {
    int sum; ll mi;
    Node() { mi = inf; }
}t[maxn << 2]; int m;
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
#define sum(x) (t[x].sum)
#define mi(x) (t[x].mi)
inline void pushup(int x, int l, int r) {
    ll ul = w(sum(x), dist[td[l]]), ur = w(sum(x), dist[td[r]]);
    mi(x) = min({ mi(x), ul, ur, mi(ls(x)), mi(rs(x)) });
}
void upd(int l, int r, int x, int id) {
    ll wl = w(id, dist[td[l]]), wr = w(id, dist[td[r]]), ul = w(sum(x), dist[td[l]]), ur = w(sum(x), dist[td[r]]);
    if (ul < wl && ur < wr) return;
    else if (wl < ul && wr < ur) { sum(x) = id; pushup(x, l, r); return; }
    int mid = l + r >> 1;
    upd(l, mid, ls(x), id);
    upd(mid + 1, r, rs(x), id);
    pushup(x, l, r);
}
void modfiy(int l, int r, int ml, int mr, int x, int id) {
    if (ml <= l && r <= mr) { upd(l, r, x, id); return; } int mid = l + r >> 1;
    if (ml <= mid) modfiy(l, mid, ml, mr, ls(x), id);
    if (mr > mid) modfiy(mid + 1, r, ml, mr, rs(x), id);
    pushup(x, l, r);
}
ll query(int l, int r, int ql, int qr, int x) {
    if (ql <= l && r <= qr) return mi(x); int mid = l + r >> 1;
    ll ans = min(w(sum(x), dist[td[max(ql, l)]]), w(sum(x), dist[td[min(r, qr)]]));
    if (ql <= mid) ans = min(ans, query(l, mid, ql, qr, ls(x)));
    if (qr > mid) ans = min(ans, query(mid + 1, r, ql, qr, rs(x)));
    return ans;
}
struct edge {
    int to, nxt; ll w;
}node[maxn]; int head[maxn], cnt = 0;
inline void add(int u, int v, ll w) {
    node[cnt].nxt = head[u];
    node[cnt].to = v;
    node[cnt].w = w;
    head[u] = cnt++;
}
void dfs1(int u, int f) {
    dep[u] = dep[f] + 1; fa[u] = f; siz[u] = 1;
    for (int i = head[u]; ~i; i = node[i].nxt) {
        int v = node[i].to;
        if (v == f) continue; dist[v] = dist[u] + node[i].w;
        dfs1(v, u); siz[u] += siz[v];
        if (siz[son[u]] < siz[v]) son[u] = v;
    }
}
void dfs2(int u, int t) {
    top[u] = t; dfn[u] = ++dct; td[dfn[u]] = u;
    if (son[u]) dfs2(son[u], t);
    for (int i = head[u]; ~i; i = node[i].nxt) {
        int v = node[i].to;
        if (v == son[u] || v == fa[u]) continue;
        dfs2(v, v);
    }
}
inline int LCA(int x, int y) {
    while (top[x] != top[y]) {
        if (dep[top[x]] < dep[top[y]]) swap(x, y);
        x = fa[top[x]];
    }
    return dep[x] < dep[y] ? x : y;
}
inline void tmod(int s, int t, int x) {
    while (top[s] != top[t]) {
        if (dep[top[s]] < dep[top[t]]) swap(s, t);
        //cout << dfn[top[s]] << " " << dfn[s] << "\n";
        modfiy(1, n, dfn[top[s]], dfn[s], 1, x); s = fa[top[s]];
    }
    if (dfn[s] > dfn[t]) swap(s, t);
    modfiy(1, n, dfn[s], dfn[t], 1, x);
}
inline ll tque(int s, int t) {
    ll ans = inf;
    while (top[s] != top[t]) {
        if (dep[top[s]] < dep[top[t]]) swap(s, t);
        ans = min(ans, query(1, n, dfn[top[s]], dfn[s], 1)); s = fa[top[s]];
    }
    if (dfn[s] > dfn[t]) swap(s, t);
    ans = min(ans, query(1, n, dfn[s], dfn[t], 1));
    return ans;
}
int p = 0;
int main() {
    memset(head, -1, sizeof(head)); int m;
    scanf("%d%d", &n, &m); S[0] = { 0, inf };
    for (int i = 1; i < n; i++) {
        int x, y; ll z;
        scanf("%d%d%lld", &x, &y, &z);
        add(x, y, z); add(y, x, z);
    }
    dfs1(1, 0); dfs2(1, 1);
    while (m--) {
        int o, s, t;
        scanf("%d%d%d", &o, &s, &t);
        if (o == 1) {
            ll a, b; scanf("%lld%lld", &a, &b); int lca = LCA(s, t);
            S[++p] = { -a, a * dist[s] + b };
            tmod(s, lca, p);
            S[++p] = { a, a * dist[s] - dist[lca] * a * 2 + b };
            tmod(lca, t, p);
        }
        else printf("%lld\n", tque(s, t));
    }
    return 0;
}
2023/12/26 19:35
加载中...