用户名或者密码错误
| 注册账号 | 忘记密码
<->

A+B problem

hhl2009 2022-10-05 16:42:45 2022-10-05 16:49:13

哈哈哈锣鼓炒的

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
using namespace std;
struct node {
    int data, rev, sum;
    node *son[2], *pre;
    bool judge();
    bool isroot();
    void pushdown();
    void update();
    void setson(node *child, int lr);
} lct[233];
int top, a, b;
node *getnew(int x) {
    node *now = lct + ++top;
    now->data = x;
    now->pre = now->son[1] = now->son[0] = lct;
    now->sum = 0;
    now->rev = 0;
    return now;
}
bool node::judge() { return pre->son[1] == this; }
bool node::isroot() {
    if (pre == lct)
        return true;
    return !(pre->son[1] == this || pre->son[0] == this);
}
void node::pushdown() {
    if (this == lct || !rev)
        return;
    swap(son[0], son[1]);
    son[0]->rev ^= 1;
    son[1]->rev ^= 1;
    rev = 0;
}
void node::update() { sum = son[1]->sum + son[0]->sum + data; }
void node::setson(node *child, int lr) {
    this->pushdown();
    child->pre = this;
    son[lr] = child;
    this->update();
}
void rotate(node *now) {
    node *father = now->pre, *grandfa = father->pre;
    if (!father->isroot())
        grandfa->pushdown();
    father->pushdown();
    now->pushdown();
    int lr = now->judge();
    father->setson(now->son[lr ^ 1], lr);
    if (father->isroot())
        now->pre = grandfa;
    else
        grandfa->setson(now, father->judge());
    now->setson(father, lr ^ 1);
    father->update();
    now->update();
    if (grandfa != lct)
        grandfa->update();
}
void splay(node *now) {
    if (now->isroot())
        return;
    for (; !now->isroot(); rotate(now))
        if (!now->pre->isroot())
            now->judge() == now->pre->judge() ? rotate(now->pre) : rotate(now);
}
node *access(node *now) {
    node *last = lct;
    for (; now != lct; last = now, now = now->pre) {
        splay(now);
        now->setson(last, 1);
    }
    return last;
}
void changeroot(node *now) {
    access(now)->rev ^= 1;
    splay(now);
}
void connect(node *x, node *y) {
    changeroot(x);
    x->pre = y;
    access(x);
}
void cut(node *x, node *y) {
    changeroot(x);
    access(y);
    splay(x);
    x->pushdown();
    x->son[1] = y->pre = lct;
    x->update();
}
int query(node *x, node *y) {
    changeroot(x);
    node *now = access(y);
    return now->sum;
}
int main() {
    scanf("%d%d", &a, &b);
    node *A = getnew(a);
    node *B = getnew(b);
    //连边 Link
    connect(A, B);
    //断边 Cut
    cut(A, B);
    //再连边orz Link again
    connect(A, B);
    printf("%d\n", query(A, B));
    return 0;
}