P1501 國家集訓隊 Tree II

2022-05-20 20:13:10 字數 1243 閱讀 5820

p1501 [國家集訓隊]tree ii

樹上懶惰標記維護動態路徑模板題

其實做這題也能練一下對\(lct\)的了解

我們對\(x,y\)這條路徑修改時:\(split(x,y);....(y)\),傳到\(y\)上去就行了

我們發現不管什麼操作都會用到\(access\),其中把底下的點上旋\(splay\)的同時會把\(y\)上的標記取下來

和線段樹差不多吧不知道為什麼是道黑題

寫**(15min)+除錯(15min)感覺比模板還容易打

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

typedef long long ll;

const ll maxn=1e6,p=51061;

inline ll read()

while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();

return x*f;

}ll n,m;

ll val[maxn],sum[maxn],lazya[maxn],lazym[maxn],fa[maxn],son[maxn][2],r[maxn],size[maxn],sta[maxn];

inline bool notroot(ll x)

inline void pushr(ll x)

inline void update(ll x)

inline void pusha(ll x,ll w)

inline void pushm(ll x,ll w)

inline void pushdown(ll x)

if(lazya[x])

if(r[x])

}inline void rotate(ll x)

inline void splay(ll x)rotate(x); }}

inline void access(ll x)

}inline void makeroot(ll x)

inline void split(ll x,ll y)

inline void link(ll x,ll y)

inline void delet(ll x,ll y)

int main()

while(m--)else if(ch=='-')else if(ch=='*')else

} return 0;

}

P1501 國家集訓隊 Tree II

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

P1501 國家集訓隊 Tree II

一棵n個點的樹,每個點的初始權值為1。對於這棵樹有q個操作,每個操作為以下四種操作之一 第一行兩個整數n,q 接下來n 1行每行兩個正整數u,v,描述這棵樹 接下來q行,每行描述乙個操作 對於每個 對應的答案輸出一行 3 2 1 22 3 1 3 4 1 1410 的資料保證,1 leq n,q l...

國家集訓隊 Tree I

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