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的路徑上的點的權...