-> 戳這裡檢視題面
julao口中的樹上帶修莫隊的板子題
這個題拆開來說就是:帶修莫隊+樹上莫隊
帶修莫隊是莫隊的最基本的一種,就是將詢問排序後,按時間戳將修改操作增加或減少
樹上莫隊有兩種寫法,分別是按照大小分塊和按照尤拉序分塊,這裡介紹用尤拉序分塊的寫法,通過尤拉序我們可以將樹上問題轉化為序列問題,因為尤拉序裡兩個相同的數之間包含ta的子樹
tip:對於樹上莫隊的尤拉序寫法還需要特別注意一下lca的特判,當\(lca(x,y)\ne x|y\)時,在尤拉序上是不會出現\(lca\)的,需要專門計算
#includeusing namespace std;
namespace zzc
e[maxn<<1];
struct chan
c[maxn];
struct que
q[maxn];
bool cmp1(que a,que b)
}if(x==y) return x;
for(int i=20;i>=0;i--)
}return fa[x][0]; }
void calc(int pos)
void update(int pos,int col)
else c[pos]=col; }
void work()
else
}sort(q+1,q+qcnt+1,cmp1);
tim=0;
ll l=1,r=0;
for(int i=1;i<=qcnt;i++)
while(rq[i].l) calc(id[--l]);
while(lq[i].r) calc(id[r--]);
ll x=id[l],y=id[r],tmp=lca(x,y);
if(tmp!=x&&tmp!=y)
else q[i].val=ans;
} sort(q+1,q+qcnt+1,cmp2);
for(int i=1;i<=qcnt;i++)
} }int main()
P4074 WC2013 糖果公園
tag 樹上帶修莫隊 題意 樹上每個點有一種糖果,求 sum c sum v c w i 其中c為糖果種類,cnt c 其為出現次數。離線樹上帶修莫隊。先進行樹上分塊。分塊內的詢問按照出發點 終止點 詢問id優先順序依次遞減排序。對於樹上莫隊,其實就是在尤拉序上莫隊。因為尤拉序的性質,即每個節點子樹...
題解 洛谷 P4074 WC2013 糖果公園
p4074 wc2013 糖果公園 給你一棵樹樹,點有點權,帶修改,每一次經過一種點權會有不同的貢獻 隨著經過次數再變 問你從乙個點到乙個點的貢獻和 樹上帶修莫隊。用 cnt i 表示 i 這個點的權值的出現次數。用 a i 表示 i 號點的權值。用 v i 表示一權值 i 的貢獻定值。用 v i ...
P4074 WC2013 糖果公園 樹上帶修莫隊
戳這裡檢視題面 julao口中的樹上帶修莫隊的板子題 這個題拆開來說就是 帶修莫隊 樹上莫隊 帶修莫隊是莫隊的最基本的一種,就是將詢問排序後,按時間戳將修改操作增加或減少 樹上莫隊有兩種寫法,分別是按照大小分塊和按照尤拉序分塊,這裡介紹用尤拉序分塊的寫法,通過尤拉序我們可以將樹上問題轉化為序列問題,...