一棵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...