标题丢了 upd:0130 22:03--22:48 字不很多但是写了好久

所以我就在这调了一天LCT,最后还是对着题解逐行鹤,本来打算写个总结什么的,年夜饭都熟了……要不是因为我居然把Splay都忘了回去现复习……我后悔啊期末考之前摆大烂结果考得太寄被抓去学whk不许coding……悲惨啊千万不能退役要不然就跟我一样……好在A了qwq新年好心情qwq qwq qwq

upd:0130 22:03 如果以前的退役划水是纯划水,那么这次的大概有真心话?

好吧事实上我是有时间做题的,但是我在本来打算做题的时候去刷accoders的一言了,去聊天了,去网上冲浪了,我承认比起Real卷王我也是更喜欢摆烂的普通学生,一时有志向一时又颓的不行,是我把自己寄掉了,谁都怪不着,是我自己一次次放弃了考好文化课的机会才导致联想孤注一掷的资格都没有,是我自己放弃了春季赛退役之后就没再认真的想过怎么翻盘,我写了那么多看似很积极的句子,我看起来或许卷过,但是有多少时间在走神只有我自己知道,幼稚,虚荣,心里除了建设一个“理想的形象”就没放什么别的,“可怜之人必有可恨之处”,回想我是怎么走到今天……我……我对不起自己……我听说“唯有爱与梦想不能辜负”,我都,,总之就是寄了,就是寄了,就是寄了。

不能为之守望到底的热爱是不是我自己对自己的精神蒙蔽呢……我不知道……我不知道……我不知道!!马上就要开学了,过去的这个假期,我摆了太久啊,如果我把那些时间都用来再为我的理想孤注一掷,最起码也给自己一个交代,但是我干了什么?就这,也配说自己对此痴情??我算个什么冒牌OIer!我自找的!我自找的!我自找的!

包括当初退役,家长和老师也并没有那么残忍,是我,连我省选必胜的信心都没有,连一句保证的话都不敢说,是我,只剩下明知自己没能力还老是做梦说要留下的死鸭子嘴硬,我就离谱,我要是真的能翻盘那才真离谱……“把故事讲到够长终将遥远岁月惊动,最低落笔锋也能与光相逢”……有什么能弥补我造下的罪孽,跨越时间与你生死相守?“以爱之名,你还愿意吗?”“我愿意啊!”

2023.3.4 start from 8 a.m. 4.5h 来不及了,来不及了,来不及了……

依然来得及的人,如果你居然在这里划水,我劝你抓紧点啊!!!我祝愿,我们都有光明的未来。

下文是LCT板子

code

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int maxn = 3e5 + 7;
#define lc c[x][0]
#define rc c[x][1]

inline int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-')
        {
            f = -1;
        }
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        x = (x << 1) + (x << 3) + (ch^48);
        ch = getchar();
    }
    return x * f;
}

int f[maxn], c[maxn][2], v[maxn], s[maxn], st[maxn];
bool r[maxn];
inline bool nroot(int x)
{
    return c[f[x]][0] == x || c[f[x]][1] == x;
}
inline void pushup(int x)
{
    s[x] = s[lc] ^ s[rc] ^ v[x];
}
inline void pushr(int x) {int t = lc; lc = rc; rc = t; r[x]^=1;}
inline void pushdown(int x)
{
    if(r[x])
    {
        if(lc) pushr(lc);
        if(rc) pushr(rc);
        r[x] = 0;
    }
}
inline void rotate(int x)
{
    int y = f[x], z = f[y], k = c[y][1]==x, w = c[x][!k];
    if(nroot(y)) c[z][c[z][1]==y] = x;
    c[x][!k] = y; c[y][k] = w;
    if(w) f[w] = y; 
    f[y] = x; f[x] = z;
    pushup(y);
}
inline void splay(int x)
{
    int y = x, z = 0;
    st[++z] = y;
    while(nroot(y)) st[++z] = y = f[y];
    while(z) pushdown(st[z--]);
    while(nroot(x))
    {
        y = f[x]; z = f[y];
        if(nroot(y))
        {
            rotate((c[y][0]==x)^(c[z][0]==y)?x:y);
        }
        rotate(x);
    }
    pushup(x);
}
inline void access(int x)
{
    for(int y=0; x; x=f[y=x])
    {
        splay(x), rc = y, pushup(x);
    }
}
inline void makeroot(int x)
{
    access(x); splay(x);
    pushr(x);
}
int findroot(int x)
{
    access(x); splay(x);
    while(lc) pushdown(x), x = lc;
    splay(x);
    return x;
}
inline void split(int x, int y)
{
    makeroot(x);
    access(y); splay(y);
}
inline void link(int x, int y)
{
    makeroot(x);
    if(findroot(y)!=x) f[x] = y;
}
inline void cut(int x, int y)
{
    makeroot(x);
    if(findroot(y)==x && f[y] == x && !c[y][0])
    {
        f[y] = c[x][1] = 0;
        pushup(x);
    }
}

int main()
{
    int n = read(), m = read();
    for(int i=1; i<=n; i++) v[i] = read();
    while(m--)
    {
        int ty = read(), x = read(), y = read();
        switch(ty)
        {
            case 0: split(x, y); printf("%d\n", s[y]); break;
            case 1: link(x, y); break;
            case 2: cut(x, y); break;
            case 3: splay(x); v[x] = y;
        }
    }

    return 0;
}

 

posted @ 2023-01-21 19:27  Catherine_leah  阅读(106)  评论(1)    收藏  举报
/* */