BZOJ 2631 tree LCT鏈上修改

2021-07-04 23:05:03 字數 2391 閱讀 1898

time limit: 30 sec  

memory limit: 128 mb

submit: 2513  

solved: 846 [

submit][

status][

discuss]

一棵n個點的樹,每個點的初始權值為1。對於這棵樹有q個操作,每個操作為以下四種操作之一:

+ u v c:將u到v的路徑上的點的權值都加上自然數c;

- u1 v1 u2 v2:將樹中原有的邊(u1,v1)刪除,加入一條新邊(u2,v2),保證操作完之後仍然是一棵樹;

* u v c:將u到v的路徑上的點的權值都乘上自然數c;

/ u v:詢問u到v的路徑上的點的權值和,求出答案對於51061的餘數。

第一行兩個整數n,q

接下來n-1行每行兩個正整數u,v,描述這棵樹

接下來q行,每行描述乙個操作

對於每個/對應的答案輸出一行

3 21 2

2 3* 1 3 4

/ 1 1

4資料規模和約定

10%的資料保證,1<=n,q<=2000

另外15%的資料保證,1<=n,q<=5*10^4,沒有-操作,並且初始樹為一條鏈

另外35%的資料保證,1<=n,q<=5*10^4,沒有-操作

100%的資料保證,1<=n,q<=10^5,0<=c<=10^4

lct,區間加,區間乘

其實pushdown操作只需要splay的時候傳下來,確保splay(x)後,x更新為正確的就行了,

其他的地方權當懶得刪了

#include#include#include#include#include#include#include#include#includeusing namespace std;

#define for(i,n) for(int i=1;i<=n;i++)

#define fork(i,k,n) for(int i=k;i<=n;i++)

#define rep(i,n) for(int i=0;i=0;i--)

#define forp(x) for(int p=pre[x];p;p=next[p])

#define forpiter(x) for(int &p=iter[x];p;p=next[p])

#define lson (x<<1)

#define rson ((x<<1)+1)

#define mem(a) memset(a,0,sizeof(a));

#define memi(a) memset(a,127,sizeof(a));

#define memi(a) memset(a,128,sizeof(a));

#define inf (2139062143)

#define f (51061)

#define maxn (100000+10)

#define maxq (100000+10)

#define maxc (10000)

typedef unsigned int ll;

void mul(ll &a,ll b)

void add(ll &a,ll b)

class lct

void pushdown(int x)

if (mulv[x]!=1)

if (addv[x])

} void maintain(int x)

void rotate(int x)

father[x]=father[y];

father[y]=x;

ch[x][!kind]=y;

if (root[y])

else

maintain(y);maintain(x); }

void p(int x)

void splay(int x)

else

} }

int access(int x)

while (x) ;

return y; }

void cut(int x)

void join(int x,int y)

void reverse(int x)

void make_root(int x)

int get_root(int x)while(1);

return x; }

void mul(int x,ll cost)

void add(int x,ll cost)

}s;int n,q;

int main()

for(i,q) else if (c[0]=='-') else if (c[0]=='/') }

return 0;

}

樹鏈剖分 bzoj2243

time limit 20 sec memory limit 512 mb submit 2492 solved 960 submit status 給定一棵有n個節點的無根樹和m個操作,操作有2類 1 將節點a到節點b路徑上所有點都染成顏色c 2 詢問節點a到節點b路徑上的顏色段數量 連續相同顏色...

BZOJ 4893 項鍊分贓

有一串長度為n的項鍊,上面有紅綠藍三種顏色的珠子,每種顏色的珠子數目都是偶數,現在要你把它切幾刀分成 若干段,把其中一些段分給海盜1,剩餘的段分給海盜2,要求兩個海盜分得的每種顏色的珠子數量都相同,請輸出 最少需要切多少刀。第一行乙個整數n,表示項鍊的長度。第二行n個0 2的整數,分別表示紅綠藍三種...

bzoj 3611(鏈剖 字首和)

來複習鏈剖吧。以前一直認為鏈剖和線段樹一定是標配。其實以前學鏈剖的時候沒有理解到位。鏈剖可以說和dfs序是同一種手段,他們都是把樹結構對映到陣列上去的手段,因此鏈剖準確來說應該是一種演算法而不是資料結構。這題記得以前貌似是用樹狀陣列維護的?也是大材小用了。include include includ...