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