# [luogu2982][USACO10FEB]慢下来Slowing down(树状数组+dfs序)

## 题目描述

Every day each of Farmer John's N (1 <= N <= 100,000) cows conveniently numbered 1..N move from the barn to her private pasture. The pastures are organized as a tree, with the barn being on pasture 1. Exactly N-1 cow unidirectional paths connect the pastures; directly connected pastures have exactly one path. Path i connects pastures A_i and B_i (1 <= A_i <= N; 1 <= B_i <= N).

Cow i has a private pasture P_i (1 <= P_i <= N). The barn's small door lets only one cow exit at a time; and the patient cows wait until their predecessor arrives at her private pasture. First cow 1 exits and moves to pasture P_1. Then cow 2 exits and goes to pasture P_2, and so on.

While cow i walks to P_i she might or might not pass through a pasture that already contains an eating cow. When a cow is present in a pasture, cow i walks slower than usual to prevent annoying her friend.


Consider the following pasture network, where the number between
parentheses indicates the pastures' owner.

1 (3)
/ \
(1) 4   3 (5)
/ \
(2) 2   5 (4)

First, cow 1 walks to her pasture:

1 (3)
/ \
[1] 4*  3 (5)
/ \
(2) 2   5 (4)

When cow 2 moves to her pasture, she first passes into the barn's
pasture, pasture 1. Then she sneaks around cow 1 in pasture 4 before
arriving at her own pasture.

1 (3)
/ \
[1] 4*  3 (5)
/ \
[2] 2*  5 (4)

Cow 3 doesn't get far at all -- she lounges in the barn's pasture, #1.

1* [3]
/ \
[1] 4*  3 (5)
/ \
[2] 2*  5 (4)

Cow 4 must slow for pasture 1 and 4 on her way to pasture 5:

1* [3]
/ \
[1] 4*  3 (5)
/ \
[2] 2*  5* [4]

Cow 5 slows for cow 3 in pasture 1 and then enters her own private pasture:

1* [3]
/ \
[1] 4*  3*[5]
/ \
[2] 2*  5* [4]

FJ would like to know how many times each cow has to slow down.

FJ想要知道奶牛们总共要放慢多少次速度。

## 输入输出格式

• Line 1: Line 1 contains a single integer: N

• Lines 2..N: Line i+1 contains two space-separated integers: A_i and B_i

• Lines N+1..N+N: line N+i contains a single integer: P_i

• Lines 1..N: Line i contains the number of times cow i has to slow down.

## 输入输出样例

5
1 4
5 4
1 3
2 4
4
2
1
5
3


0
1
0
2
1 请参见bzoj1103http://www.cnblogs.com/Pumbit-Legion/p/5874113.html
 1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 typedef struct{
5     int to,nxt;
6 }edge;
7 edge gra[200010];
9 int beg[100010],end[100010],cnt=0;
10 int bit[100010],n;
11 inline int add(int frm,int to){
13     gra[num].to=to;
15     return 0;
16 }
17 inline int lb(int x){
18     return x&(-x);
19 }
20 int dfs(int u,int fa){
21     beg[u]=++cnt;
23         if(gra[j].to!=fa)dfs(gra[j].to,u);
24     }
25     end[u]=cnt;
26 }
27 int q(int x){
28     int ans=0;
29     while(x){
30         ans+=bit[x];
31         x-=lb(x);
32     }
33     return ans;
34 }
35 int c(int x,int v){
36     while(x<=n){
37         bit[x]+=v;
38         x+=lb(x);
39     }
40     return 0;
41 }
42 int main(){
43     scanf("%d",&n);
44     int u,v;
45     for(int i=1;i<n;i++){
46         scanf("%d %d",&u,&v);
49     }
50     dfs(1,0);
51     for(int i=1;i<=n;i++){
52         int x;
53         scanf("%d",&x);
54         printf("%d\n",q(beg[x]));//对于结束坐标重合的情况，查end[x]是错的，end[x]+1也是错的
55         c(beg[x],1);
56         c(end[x]+1,-1);
57     }
58     return 0;
59 }
View Code

posted @ 2016-09-15 01:01  Pumbit-Legion  阅读(315)  评论(0编辑  收藏  举报