BZOJ3589 動態樹 樹鏈剖分 線段樹

2022-05-20 17:43:29 字數 1815 閱讀 2272

別忘了這是一棵動態樹, 每時每刻都是動態的. 小明要求你在這棵樹上維護兩種事件

事件0:

這棵樹長出了一些果子, 即某個子樹中的每個節點都會長出k個果子.

事件1:

小明希望你求出幾條樹枝上的果子數. 一條樹枝其實就是乙個從某個節點到根的路徑的一段. 每次小明會選定一些樹枝, 讓你求出在這些樹枝上的節點的果子數的和. 注意, 樹枝之間可能會重合, 這時重合的部分的節點的果子只要算一次.

第一行乙個整數n(1<=n<=200,000), 即節點數.

接下來n-1行, 每行兩個數字u, v. 表示果子u和果子v之間有一條直接的邊. 節點從1開始編號.

在接下來乙個整數nq(1<=nq<=200,000), 表示事件.

最後nq行, 每行開頭要麼是0, 要麼是1.

如果是0, 表示這個事件是事件0. 這行接下來的2個整數u, delta表示以u為根的子樹中的每個節點長出了delta個果子.

如果是1, 表示這個事件是事件1. 這行接下來乙個整數k(1<=k<=5), 表示這次詢問涉及k個樹枝. 接下來k對整數u_k, v_k, 每個樹枝從節點u_k到節點v_k. 由於果子數可能非常多, 請輸出這個數模2^31的結果.

對於每個事件1, 輸出詢問的果子數.

51 2

2 32 4

1 53

0 1 1

0 2 3

1 2 3 1 1 4

131 <= n <= 200,000, 1 <= nq <= 200,000, k = 5.

生成每個樹枝的過程是這樣的:先在樹中隨機找乙個節點, 然後在這個節點到根的路徑上隨機選乙個節點, 這兩個節點就作為樹枝的兩端.

題解:話說這題做法好多啊,容斥、打標記、黑科技。。。是資料比較良心的緣故?

#include #include #include #define lson x<<1

#define rson x<<1|1

using namespace std;

const int maxn=200010;

int n,m,cnt,now,ans;

int to[maxn<<1],next[maxn<<1],head[maxn],v[maxn],fa[maxn],dep[maxn],siz[maxn],son[maxn],top[maxn];

int tt[maxn<<2],ts[maxn<<2],s[maxn<<2],tm[maxn<<2],tn[maxn<<2],p[maxn],q[maxn];

void add(int a,int b)

void dfs1(int x) }}

void dfs2(int x,int tp)

void pushdown(int l,int r,int x)

}void pushup(int x)

void updata(int l,int r,int x,int a,int b,int c)

pushdown(l,r,x);

int mid=l+r>>1;

if(a<=mid) updata(l,mid,lson,a,b,c);

if(b>mid) updata(mid+1,r,rson,a,b,c);

pushup(x);

}void q2(int l,int r,int x)

void ask(int x,int y)

while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();

return ret*f;

}int main()

} return 0;

}

樹鏈剖分 BZOJ3589 動態樹

time limit 30 sec memory limit 1024 mb submit 543 solved 193 submit status discuss 別忘了這是一棵動態樹,每時每刻都是動態的.小明要求你在這棵樹上維護兩種事件 事件0 這棵樹長出了一些果子,即某個子樹中的每個節點都會長...

bzoj 3589 動態樹 (樹鏈剖分 線段樹)

time limit 30 sec memory limit 1024 mb submit 451 solved 155 submit status discuss 別忘了這是一棵動態樹,每時每刻都是動態的.小明要求你在這棵樹上維護兩種事件 事件0 這棵樹長出了一些果子,即某個子樹中的每個節點都會長...

BZOJ 3589 動態樹 樹鏈剖分 線段樹

題目傳送門 最近心真的有點浮躁啊 連題目都不想好好看了 於是就把 一條樹枝其實就是乙個從某個節點到根的路徑的一段 看成了 一條樹枝其實就是乙個從某個節點到根的路徑 wqnmlgb 操作1的k 5 那麼是不是會想到容斥?對兩條路徑求交?但是分析一下時間複雜度,o m log22n 2k 接近20億啊 ...