HAOI2015 樹上操作

2022-05-09 14:58:05 字數 2754 閱讀 1615

嘟嘟嘟

樹剖自然可解,就是一道板子題,而且這道題還只問到根節點的距離是多少,而不是樹上任意兩點距離,就更方便了。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11

using

namespace

std;

12#define enter printf("\n")

13#define space printf(" ")

14#define mem(a) memset(a, 0, sizeof(a))

15 typedef long

long

ll;16

#define int long long

17 typedef double

db;18

const

int inf = 0x3f3f3f3f;19

const

int eps = 1e-8;20

const

int maxn = 1e5 + 5;21

inline ll read()

2226

while

(isdigit(ch))

2730

if(last == '

-') ans = -ans;

31return

ans;32}

33 inline void

write(ll x)

3439

40int

n, m;

41ll a[maxn];

42 vectorv[maxn];

4344

bool

vis[maxn];

45int

dep[maxn], fa[maxn], son[maxn], size[maxn];

46void dfs1(int

now)

4759}60

}6162int dfsx[maxn], pos[maxn], top[maxn], cnt = 0;63

void dfs2(int

now)

6471

for(int i = 0; i < (int)v[now].size(); ++i)

7278}79

}8081int l[maxn << 2], r[maxn << 2

];82 ll sum[maxn << 2], lazy[maxn << 2

];83

void build(int l, int r, int

now)

8487

int mid = (l + r) >> 1

;88 build(l, mid, now << 1

);89 build(mid + 1, r, now << 1 | 1

);90 sum[now] = sum[now << 1] + sum[now << 1 | 1

];91}92

void pushdown(int

now)

93102

}103

void update(int l, int r, int now, int

d)104

110pushdown(now);

111int mid = (l[now] + r[now]) >> 1

;112

if(r <= mid) update(l, r, now << 1

, d);

113else

if(l > mid) update(l, r, now << 1 | 1

, d);

114else update(l, mid, now << 1, d), update(mid + 1, r, now << 1 | 1

, d);

115 sum[now] = sum[now << 1] + sum[now << 1 | 1

];116

}117 ll query(int l, int r, int

now)

118126

127 ll query_path(int

x)128

135 ret += query(dfsx[top[1]], dfsx[x], 1

);136

return

ret;

137}

138139

main()

140148 dfs1(1

); mem(vis);

149 top[1] = 1; dfs2(1); //

別忘top[1] = 1

150 build(1, cnt, 1

);151

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

152159

else

if(d == 2

)160

164else

write(query_path(x)), enter;

165}

166//

return 0;

167 }

view code

寫完樹剖後發現線段樹也可以,只要先跑一邊dfs序,同時維護每乙個點到根節點的路徑的權值和,然後修改就是正常的區間修改,因為dfs序滿足同一棵子樹序號連續。然後單點查詢。有興趣的可以自己寫一下~~

HAOI2015 樹上操作

題目描述 有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個操作,分為三種 操作 1 把某個節點 x 的點權增加 a 操作 2 把某個節點 x 為根的子樹中所有點的點權都增加 a 操作 3 詢問某個節點 x 到根的路徑中所有點的點權和。輸入格式 第一行包含兩個整數 n,m 表示點數...

HAOI2015 樹上操作

有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個操作,分為三種 操作 1 把某個節點 x 的點權增加 a 操作 2 把某個節點 x 為根的子樹中所有點的點權都增加 a 操作 3 詢問某個節點 x 到根的路徑中所有點的點權和。輸入格式 第一行包含兩個整數 n,m 表示點數和運算元。...

HAOI2015 樹上操作

題目 bzoj4034 洛谷p3178。題目大意 有一棵點數為 n 的樹,以點 1 為根,且樹有點權。然後有 m 個操作,分為三種 操作 1 把某個節點 x 的點權增加 a 操作 2 把某個節點 x 為根的子樹中所有點的點權都增加 a 操作 3 詢問某個節點 x 到根的路徑中所有點的點權和。現在要你...