zoukankan      html  css  js  c++  java
  • 小H和游戏

    小H和游戏

    题目描述

    小H正在玩一个战略类游戏,她可以操纵己方的飞机对敌国的N座城市(编号为1~N)进行轰炸

    敌国的城市形成一棵树,小H会依次进行Q次轰炸,每次会选择一个城市A进行轰炸,和这座城市距离不超过2的城市都会受损(这里距离的定义是两点最短路径上的边数),轰炸结束后,小H还想知道当前城市A受损的次数

    作为游戏的开发者之一,你有义务回答小H的问题

    输入描述

    第一行,两个整数N((1 leq N leq 750000)),Q((1leq Q leq 750000))

    第2~N行,每行连个整数表示树上的一条边

    第N+1~N+Q行,每行一个整数,表示小H这次轰炸的城市

    输出描述

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

    样例输入

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

    样例输出

    1 
    2 
    3 
    3
    

    思路

    一个城市受到轰炸会影响到其父节点和父节点的父节点,子节点和子节点的子节点,所以设置一个数组(cnt[i][3]),表示i号城市的影响

    (cnt[i][0])表示对当前点的影响,

    (cnt[i][1])表示对子节点的影响

    (cnt[i][2])表示对子节点的子节点的影响。

    这题重点是理解这里的记录方式

    代码

    /**********************************************************
    * @Author: 			   Kirito
    * @Last Modified by:   Kirito
    * @Remark:
    **********************************************************/
    #include <bits/stdc++.h>
    #define lowbit(x) (x&(-x))
    #define CSE(x,y) memset(x,y,sizeof(x))
    #define INF 0x3f3f3f3f
    #define Abs(x) (x>=0?x:(-x))
    #define FAST ios::sync_with_stdio(false);cin.tie(0);
    using namespace std;
    
    typedef long long ll;
    typedef pair<int,int> pii;
    typedef pair<ll , ll> pll;
    
    const int maxn=750055;
    //邻接表
    int u[maxn<<1],v[maxn<<1],first[maxn<<1],nxt[maxn<<1],n,cnt,q;
    //fathernode
    int fa[maxn];
    //son
    int ct[maxn][3];
    
    void add(int a,int b){
        u[++cnt]=a;v[cnt]=b;
        nxt[cnt]=first[u[cnt]];
        first[u[cnt]]=cnt;
        return;
    }
    
    void dfs(int now,int pre){
        fa[now]=pre;
        for(int i=first[now];i!=-1;i=nxt[i]){
            if(v[i]==pre) continue;
            dfs(v[i],now);
        }
        return;
    }
    
    int main()
    {
    	#ifndef ONLINE_JUDGE
    	freopen("in.in","r",stdin);
    	#endif
    	FAST;
    	CSE(first,-1);CSE(ct,0);CSE(fa,0);
        cin>>n>>q;
        for(int i=1;i<=n-1;i++){
            int x,y;cin>>x>>y;
            add(x,y);add(y,x);
        }
        dfs(1,0);
        while(q--){
            int k;cin>>k;
            ct[k][1]++;ct[k][2]++;//对子孙节点的影响记录
            ct[fa[k]][0]++;ct[fa[fa[k]]][0]++;//对父节点和父父节点的影响的记录
            ct[fa[k]][1]++;//对同一个父亲的其他子节点的影响的记录
            cout<<ct[k][0]+ct[fa[k]][1]+ct[fa[fa[k]]][2]<<endl;
        }
    	return 0;
    }
    
  • 相关阅读:
    C#如何防止程序多次运行的技巧
    C#导出Excel按照指定格式设置单元格属性值
    js前台遍历后台返回的Datatable数据
    Datatable数据分组
    DataTable 详解(转)
    遍历Datatable
    DataTable转Json
    键值集合List转换成datatable
    DataTable转换成实体
    泛型集合与DataSet相互转换
  • 原文地址:https://www.cnblogs.com/LeafLove/p/12756141.html
Copyright © 2011-2022 走看看