[luoguP2982][USACO10FEB]慢下来Slowing down(dfs序 + 线段树)
2017-05-08 21:00
344 查看
这个题显然可以用树链剖分做。
然而线段树也能做。
每个点都对它的子树有贡献,所以先求一边 dfs序,然后直接在 dfs序 中搞 线段树 就行。
——代码
#include <cstdio> #include <cstring> #define root 1, 1, n #define ls now << 1, l, mid #define rs now << 1 | 1, mid + 1, r using namespace std; const int MAXN = 100001; int n, cnt, tim; int head[MAXN], to[MAXN << 1], next[MAXN << 1], add[MAXN << 2], tid[MAXN], size[MAXN]; inline void add_edge(int x, int y) { to[cnt] = y; next[cnt] = head[x]; head[x] = cnt++; } inline void dfs(int u) { int i, v; tid[u] = ++tim; size[u] = 1; for(i = head[u]; i != -1; i = next[i]) { v = to[i]; if(!size[v]) dfs(v), size[u] += size[v]; } } inline void push_down(int now) { if(!add[now]) return; add[now << 1] += add[now]; add[now << 1 | 1] += add[now]; add[now] = 0; } inline int query(int x, int now, int l, int r) { if(l == r) return add[now]; push_down(now); int mid = (l + r) >> 1; if(x <= mid) return query(x, ls); else return query(x, rs); } inline void update(int x, int y, int now, int l, int r) { if(x <= l && r <= y) { add[now]++; return; } if(l > y || r < x) return; push_down(now); int mid = (l + r) >> 1; update(x, y, ls); update(x, y, rs); } int main() { int i, x, y; scanf("%d", &n); memset(head, -1, sizeof(head)); for(i = 1; i < n; i++) { scanf("%d %d", &x, &y); add_edge(x, y); add_edge(y, x); } dfs(1); for(i = 1; i <= n; i++) { scanf("%d", &x); printf("%d\n", query(tid[x], root)); update(tid[x], tid[x] + size[x] - 1, root); } return 0; }View Code
相关文章推荐
- 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)
- LuoguP2846[USACO08NOV]光开关Light Switching【线段树维护区间异或】By cellur925
- 洛谷 P2982 [USACO10FEB]慢下来Slowing down
- [luoguP2983] [USACO10FEB]购买巧克力Chocolate Buying(贪心)
- [luoguP3178] [HAOI2015]树上操作(dfs序 + 线段树 || 树链剖分)
- [luoguP3606] [USACO17JAN]Building a Tall Barn建谷仓(贪心 + 线段树)
- 洛谷2982 USACO10FEB 慢下来 Slowing down
- USACO section 2.4 Overfencing(dfs+bfs)
- Cryptcowgraphy USACO 4.1(dfs搜索+剪枝)
- USACO 2.3 Controlling Companies(DFS)
- bzoj 1593: [Usaco2008 Feb]Hotel 旅馆【线段树】
- 【BZOJ3888】【Usaco2015 Jan】Stampede 线段树判区间覆盖
- CF 258E Little Elephant and Tree(DFS+线段树)
- USACO Section 5.3 Milk Measuring (IDDFS+dp)
- Milk Measuring_usaco 5.3_dfsid
- USACO Shaping Regions(二维线段树做法 原USACO3.1.4?还是3.4.1?)
- usaco2.13Healthy Holsteins(dfs枚举)
- codeforces#225-C - Propagating tree-dfs序(奇偶)+线段树
- USACO 1.5.4 Checker Challenge ———— DFS
- HDU 3974 Assign the task(DFS建树+线段树)