國家集訓隊 Tree II

2022-08-16 00:54:26 字數 1316 閱讀 7117

lct維護這種東西是要比線段樹要噁心的多的……畢竟線段樹的區間大小是可以直接通過區間左右端點算出的,但是lct就不行,必須手動維護。並且,線段樹的維護是(左兒子+右兒子),但是lct的維護是(左兒子+自己+右兒子)!

請務必先把線段樹模板做掉,關於運算的優先順序什麼的實在不應該放到這道題裡講吧……

注意細節,比如修改時,乘法\(tag\),加法\(tag\),本身的值,區間的和,都要修改,並且每個修改的方式都還不一樣。

**:

#includeusing namespace std;

const int mod=51061;

#define lson t[x].ch[0]

#define rson t[x].ch[1]

int n,q;

struct lctt[100100];

int identify(int x)

void rev(int x)

void pushdown(int x)

if(lson)t[lson].val=(1ll*t[lson].val*t[x].mul+t[x].plu)%mod,t[lson].plu=(1ll*t[lson].plu*t[x].mul+t[x].plu)%mod,t[lson].mul=(1ll*t[lson].mul*t[x].mul)%mod,t[lson].sum=(1ll*t[lson].sum*t[x].mul+1ll*t[x].plu*t[lson].sz)%mod;

if(rson)t[rson].val=(1ll*t[rson].val*t[x].mul+t[x].plu)%mod,t[rson].plu=(1ll*t[rson].plu*t[x].mul+t[x].plu)%mod,t[rson].mul=(1ll*t[rson].mul*t[x].mul)%mod,t[rson].sum=(1ll*t[rson].sum*t[x].mul+1ll*t[x].plu*t[rson].sz)%mod;

t[x].plu=0,t[x].mul=1;

}void pushup(int x)

void rotate(int x)

void pushall(int x)

void splay(int x)

}void access(int x)

void makeroot(int x)

int findroot(int x)

void link(int x,int y)

int split(int x,int y)

void cut(int x,int y)

int main()

return 0;

}

國家集訓隊 Tree II

題目 這不是線段樹模板2放 lct 上了嗎 於是開始碼碼碼 之後一直wawawa 於是開始調調調 之後旁邊的慎老師看了一看 就說,你下放乘法標記的時候不乘加法標記嗎 我 include include include include define maxn 300005 define re regi...

國家集訓隊 Tree II 題解

題目傳送門 題目大意 給一棵樹,若干種操作 路徑加,路徑乘,刪邊加邊,求路徑和。看到刪邊加邊就知道是 lct lctlc t 了。路徑加路徑乘都是打個標記的事,但是在更新 sum sumsu m 的時候,sum sumsu m 不僅要乘上乘法標記,還要加上加法標記乘 siz esize size 的...

Luogu1501 國家集訓隊 Tree II

題目描述 一棵n個點的樹,每個點的初始權值為1。對於這棵樹有q個操作,每個操作為以下四種操作之一 u v c 將u到v的路徑上的點的權值都加上自然數c u1 v1 u2 v2 將樹中原有的邊 u1,v1 刪除,加入一條新邊 u2,v2 保證操作完之後仍然是一棵樹 u v c 將u到v的路徑上的點的權...