牛客算法周周练2 - 小H和游戏(DFS)

牛客算法周周练2 - 小H和游戏(DFS)

链接:https://ac.nowcoder.com/acm/contest/5203/D
来源:牛客网

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

小H正在玩一个战略类游戏,她可以操纵己方的飞机对敌国的N座城市(编号为1~N)进行轰炸
敌国的城市形成了一棵树,小H会依次进行Q次轰炸,每次会选择一个城市A进行轰炸,和这座城市距离不超过2的城市都会受损(这里距离的定义是两点最短路径上的边数)
轰炸结束后,小H还想知道当前城市A受损的次数
作为游戏的开发者之一,你有义务回答小H的问题

输入描述:

第1行,两个整数N(1≤N≤750000)、Q(1≤Q≤750000)
第2~N行,每行两个整数表示树上的一条边
第N+1~N+Q行,每行一个整数,表示小H这次轰炸的城市

输出描述:

输出Q行,每行一个整数表示这一次轰炸的城市在此次轰炸后共计受损几次

示例1

输入

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

输出

1 
2 
3 
3

 

 

对于城市u, 我们考虑用一个fa数组找到城市的祖先fa[u], 它的祖先的祖先就是fa[fa[u]]

num[i][0]表示i点对自身的影响,num[i][1]表示i点对儿子的影响,num[i][2]表示i点对孙子的影响

每次查询我们都直接更新num即可

轰炸x会对以下点造成贡献:

距离0:x本身

距离1:x的父亲和儿子

距离2:x的爷爷和孙子和兄弟

这里要特别注意的是很容易把num[fa[x]][1]++写成num[x][0]++。因为一个点被轰炸,它的兄弟结点肯定全被轰炸。

最后输出的是num[x][0]+num[fa[x]][1]+num[fa[fa[x]]][2]

 

 1 #include <bits/stdc++.h>
 2 typedef long long LL;
 3 #define pb push_back
 4 const int INF = 0x3f3f3f3f;
 5 const double eps = 1e-8;
 6 const int mod = 1e9+7;
 7 const int maxn = 8e5+10;
 8 using namespace std;
 9 
10 vector<int> vt[maxn];
11 int fa[maxn];
12 int num[maxn][3];
13 
14 void DFS(int u,int pre)
15 {
16     fa[u]=pre;
17     for(int i=0;i<vt[u].size();i++)
18     {
19         int v=vt[u][i];
20         if(v!=pre) DFS(v,u);
21     }
22 }
23 
24 int main()
25 {
26     #ifdef DEBUG
27     freopen("sample.txt","r",stdin); //freopen("data.out", "w", stdout);
28     #endif
29     
30     int n,q;
31     scanf("%d %d",&n,&q);
32     for(int i=1;i<n;i++)
33     {
34         int u,v;
35         scanf("%d %d",&u,&v);
36         vt[u].pb(v); vt[v].pb(u);
37     }
38     DFS(1,0);
39     for(int i=1;i<=q;i++)
40     {
41         int x;
42         scanf("%d",&x);
43         num[fa[fa[x]]][0]++;//爷爷节点对自己影响+1
44         num[fa[x]][0]++;//父亲节点对自己影响+1
45         num[fa[x]][1]++;//父亲节点对儿子影响+1,注意不要写成num[x][0]++了
46         num[x][1]++;//x对儿子节点影响+1
47         num[x][2]++;//x对孙子节点影响+1
48         printf("%d\n",num[x][0]+num[fa[x]][1]+num[fa[fa[x]]][2]);
49     }
50     
51     return 0;
52 }

 

 

-

posted @ 2020-04-24 14:20  jiamian22  阅读(161)  评论(0编辑  收藏  举报