P1501 國家集訓隊 Tree II

2022-07-20 04:24:09 字數 1555 閱讀 6131

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

第一行兩個整數n,q

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

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

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

3 2

1 22 3

* 1 3 4

/ 1 1

4
10%的資料保證,\(1\leq n,q\leq 2000\)

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

另外35%的資料保證,\(1\leq n,q\leq 5*10^4\),沒有-操作

100%的資料保證,\(1\leq n,q\leq 10^5,0\leq c\leq 10^4\)

顯然有link,cut的操作

所以用lct來維護這個樹

對於那些加,乘,模擬線段樹打標記來維護

#includeusing namespace std;

#define ll long long

ll in()

const int mod = 51061;

const int maxn = 1e5 + 5;

struct lct

void g(ll a, ll m)

bool ntr()

bool isr()

void trn()

void dwn()

if(ch[0]) ch[0]->g(add, mul);

if(ch[1]) ch[1]->g(add, mul);

add = 0, mul = 1;

} void upd()

}s[maxn], *t[maxn];

int top;

void rot(node *x)

void splay(node *o)

} void access(node *x)

void makeroot(node *x)

node *findroot(node *x)

void link(node *x, node *y)

void cut(node *x, node *y)

int query(node *x, node *y)

void addpath(node *x, node *y, ll c)

void mulpath(node *x, node *y, ll c)

public:

void link(int x, int y)

void cut(int x, int y)

void add(int x, int y, ll c)

void mul(int x, int y, ll c)

int query(int x, int y)

}v;char getch()

int main()

return 0;

}

P1501 國家集訓隊 Tree II

傳送門 顯然 lct 維護,除了翻轉標記,還要維護加法,乘法和子樹大小 注意模數看起來很小,但是乘的時候還是會爆 int 所以要用 unsigned int 中的標記為延時標記,就是當前節點的標記說明當前節點還沒更新,要等到下傳標記時才更新,個人認為會好寫一些 不用考慮先乘還是先加 注意乘法標記初始...

P1501 國家集訓隊 Tree II

p1501 國家集訓隊 tree ii 樹上懶惰標記維護動態路徑模板題 其實做這題也能練一下對 lct 的了解 我們對 x,y 這條路徑修改時 split x,y y 傳到 y 上去就行了 我們發現不管什麼操作都會用到 access 其中把底下的點上旋 splay 的同時會把 y 上的標記取下來 和...

國家集訓隊 Tree I

題目 給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有nee dneed need 條白色邊的生成樹。題目保證有解。思路 凸優化裸題,要注意的就是,優先選白色 優先選黑色也行 主要是同一斜率可能會切到很多點,那麼就要有乙個標準,要麼選最小點,要麼選最大。另外求出來的點不一定是ne...