洛谷 P3950 部落衝突(樹鏈剖分 樹狀陣列)

2021-10-11 18:22:23 字數 1759 閱讀 2790

p3950 部落衝突

給一棵樹,q操作是u,v是否可達,c操作是u,v間的簡單路徑不可走,u是撤銷第i個c操作。

樹鏈剖分+樹狀陣列。樹鏈剖分點權改邊權,對於u,v間的簡單路徑不可走可以邊權都加1,撤銷就是邊權都減1,詢問就樹狀陣列維護區間和,0就可達。題目限制保證了思路合法。題面裡保證兩點相鄰不是有直接邊相鄰的意思,是可達的意思。

#include

using

namespace std;

const

int n=

300005

;int son[n]

;//son[i]表示i的重兒子

int size[n]

;//size[i]表示i為根包含自己的字數節點個數

int f[n]

;//f[i]表示i的父親

int dep[n]

;//dep[i]表示i的深度

vector<

int> g[n]

;int a[n]

, sum1[n]

, sum2[n]

;int n, m;

struct work

;vector e;

intlowbit

(int x)

void

updata

(int i,

int k)

}int

getsum

(int i)

return res;

}void

addedge

(int u,

int v)

void

dfs1

(int cur,

int fa)

}int top[n]

;//top[i]表示節點i所在鏈的頂端

int id[n]

;//id[i]表示i的新編號

int val[n]

;//val[i]表示新編號的點權

int cnt;

void

dfs2

(int cur,

int t)

intquery_val

(int x,

int y)

if(id[x]

> id[y]

)swap

(x, y)

; ans+

=getsum

(id[y])-

getsum

(id[x]);

return ans;

}void

update_edge

(int x,

int y,

int val)

if(id[x]

> id[y]

)swap

(x, y)

;updata

(id[x]+1

,val)

;updata

(id[y]+1

,-val);}

void

init()

intmain()

f[1]=

1;dfs1(1

,1);

dfs2(1

,1);

char flag;

int x,y;

while

(m--))

;}else

if(flag==

'u')

else

}return0;

}

P3950 部落衝突(樹鏈剖分)

簡單起見,你就是要處理下面三件事,所有的事件都是按照時間順序給出的。q p q從第 pp 個部落出發的建築工人想知道能否到達第 qq 個部落了,你要回答的便是yes no,注意大小寫。c p q第 pp 個部落與第 qq 個部落開戰了,保證他們一定是相鄰的部落,且目前處於停戰 未開戰 狀態。u x第...

luogu題解 P3950部落衝突 樹鏈剖分

大佬都用lct,我太弱只會樹鏈剖分 乙個很裸的維護邊權樹鏈剖分題.按照套路,對於一條邊 dep u 讓它邊權加1就在 v 點處 1,將邊的問題轉化為點的問題 然後對於c,u操作,線段樹單點修改,q操作區間查詢 include include include include include inclu...

洛谷P3950 部落衝突 LCT

題目傳送門 格式難調,體面就不放了。分析 julao們應該都看得出來就是個 lct 板子,戰爭就 cut 結束就 link 詢問就 find 沒了。太久沒打 lct 然後發現自己之前貌似理解得並不透徹,打得還是不熟。code it is made by holselee on 5th sep 201...