11 03T2 樹鏈剖分

2022-05-01 18:24:08 字數 2739 閱讀 3417

給你一棵樹,每次詢問樹上兩條鏈是否有交點。

第一行n,表示n個結點

第二行開始n-1行倆個·數x y,表示x,y有一條邊

接下來q,表示q個詢問

接下來q行四個數a b c d,詢問a到b的鏈是否與c到d的鏈有交點

輸出q行(yes或no)

sample input

輸入1:

1 21 3

2 42 5

5 65 7

3 82 5 4 3

5 3 8 8

5 4 6 7

4 8 6 7

輸入2:

2 13 1

4 25 3

6 27 2

8 59 3

10 6

11 5

12 7

13 11

14 1

15 1

1 2 3 4

4 7 1 9

2 3 7 9

2 6 7 8

2 1 6 8

sample output

輸出1:

yesno

yesno

輸出2:

yesno

yesyes

yes30%的資料1≤n,q≤3000

另外20%資料是一條鏈

100%的資料1≤n,q≤100000

題意:給你一棵樹,每次詢問樹上兩條鏈是否有交點。

30% 將第一條鏈上所有點打上標記,再遍歷第二條鏈,檢視第二條鏈上是 否有打上標記的點。

另外 20% 樹退化為一條鏈,每次詢問等價於查詢數軸上兩條線段是否相交。 100% 仔細觀察不難發現,兩條樹鏈相交的充要條件是其中一條路徑的頂點 在另一條路徑上,每次詢問求出 lca 判斷即可。

管他什麼正解,直接上樹鏈剖分

code:

1 #include2 #include3

#define n 1000006

4#define lc (p<<1)

5#define rc (p<<1|1)

6using

namespace

std;

7struct

nodee[n];

10int

first[n],nxt[n],cnt;

11void add(int u,int

v)17

struct

tt[n];

20void pushup(int

p)23

void pushnow(int p,int

v)27

void pushdown(int

p)33}34

void build(int p,int l,int

r)41

int mid=l+r>>1;42

build(lc,l,mid);

43 build(rc,mid+1

,r);

44pushup(p);45}

46void update(int p,int ql,int qr,int

v)51

pushdown(p);

52int mid=t[p].l+t[p].r>>1;53

if(ql<=mid)update(lc,ql,qr,v);

54if(qr>mid)update(rc,ql,qr,v);

55pushup(p);56}

57int query(int p,int ql,int

qr)61

int ans=0;62

pushdown(p);

63int mid=t[p].l+t[p].r>>1;64

if(ql<=mid)ans+=query(lc,ql,qr);

65if(qr>mid)ans+=query(rc,ql,qr);

66pushup(p);

67return

ans;68}

69int

siz[n],hson[n],fa[n],dep[n];

70void dfs1(int

x)82}83

inttop[n],num[n],pre[n],tot;

84void dfs2(int x,int

tp)94}95

void modify(int x,int y,int

v)101

if(dep[x]102 update(1

,num[y],num[x],v);

103}

104int ask_sum(int x,int

y)111

if(dep[x]112 ans+=query(1

,num[y],num[x]);

113return

ans;

114}

115int

read()

122while

(isdigit(c))

126return x*f;

127}

128int

main()

137 dfs1(1

);138 dfs2(1,1

);139 build(1,1

,n);

140int

m;141 m=read();

142for(int i=1;i<=m;i++)

150}

151//

除錯語句注意

over

10 24T2 樹鏈剖分

2.盟主的憂慮 worry 問題描述 江湖由 n 個門派 2 n 100,000,編號從 1 到 n 組成,這些門派之間有 n 1 條小道將他們連線起來,每條道路都以 尺 為單位去計量,武林盟主發現任何兩個門派都能夠直接或者間接通過小道連線。雖然整個江湖是可以互相到達的,但是他擔心有心懷不軌之徒破壞...

NOIP模擬(11 03)T2 排列

排列 題目背景 11.03 noip 模擬t2 分析 線段樹 唯一一道可做題 我們從n 1 來確定每個數的位置,顯然,我們放入 n的時候,他一定在乙個逆序對數為 0的位置,因為它的前面不可能有比它大的,其次,如果 0位有多個,它一定在最後乙個 0位上,因為如果在前面的 0位上,後面的 0位上的數字一...

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...