首页 > 其他 > 详细

wannafly 挑战赛10 小H和游戏

时间:2018-02-26 20:07:09      阅读:174      评论:0      收藏:0      [点我收藏+]

题解:

先利用dfs找出各个节点之间的关系。然后利用一个sum[i][j] 数组  sum[i][0] 表示i这个节点收到影响的次数 sum[i][1]表示i这个节点的儿子们收到影响的次数 sum[i][2]表示i的孙子们受到影响的次数,那么我们

可以用sum[f[f[x]]][2]+sum[f[x]][1]+sum[x][0] 表示x这个点被炸的次数,当要轰炸x的时候,
        sum[f[f[x]]][0]++; // grafa
        sum[f[x]][0]++;// fa
        sum[f[x]][1]++; // x以及x的兄弟们
        sum[x][1]++;// son
        sum[x][2]++; // 
便可以覆盖所有的情况

#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int n,q;
int f[750001];
int sum[750001][4];
vector<int> edge[750001];

void dfs(int pos,int fa)
{
    int len=edge[pos].size();//
    f[pos]=fa;
    for(int i=0;i<len;i++)
    {
        int next = edge[pos][i];
        if(next!=fa)
        {
            dfs(next,pos);
        }
    }
}


int main()
{
    cin>>n>>q;
    for(int i=0;i<n;i++) edge[i].clear();
    for(int i=1;i<n;i++)
    {
        int x,y;
        scanf("%d %d",&x,&y);
        edge[x].push_back(y);
        edge[y].push_back(x);
    }
    dfs(1,1);
    memset(sum,0,sizeof(sum));
    f[1]=0;
    f[0]=0;
    while(q--)
    {
        int x;
        cin>>x;
        sum[f[f[x]]][0]++;
        sum[f[x]][0]++;
        sum[f[x]][1]++; // sum[x][0]++ 这么写是错的是因为漏掉了他的兄弟们。。。
        sum[x][1]++;
        sum[x][2]++;
        cout<<sum[f[f[x]]][2]+sum[f[x]][1]+sum[x][0]<<endl;
    }
    return 0;
}

 

wannafly 挑战赛10 小H和游戏

原文:https://www.cnblogs.com/z1141000271/p/8475444.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!