嘟嘟嘟
樹剖自然可解,就是一道板子題,而且這道題還只問到根節點的距離是多少,而不是樹上任意兩點距離,就更方便了。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11view codeusing
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 }
寫完樹剖後發現線段樹也可以,只要先跑一邊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 到根的路徑中所有點的點權和。現在要你...