wannafly 挑战赛10 小H和游戏
2024-08-26 18:34:10
题解:
先利用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[];
int sum[][];
vector<int> edge[]; void dfs(int pos,int fa)
{
int len=edge[pos].size();//
f[pos]=fa;
for(int i=;i<len;i++)
{
int next = edge[pos][i];
if(next!=fa)
{
dfs(next,pos);
}
}
} int main()
{
cin>>n>>q;
for(int i=;i<n;i++) edge[i].clear();
for(int i=;i<n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
edge[x].push_back(y);
edge[y].push_back(x);
}
dfs(,);
memset(sum,,sizeof(sum));
f[]=;
f[]=;
while(q--)
{
int x;
cin>>x;
sum[f[f[x]]][]++;
sum[f[x]][]++;
sum[f[x]][]++; // sum[x][0]++ 这么写是错的是因为漏掉了他的兄弟们。。。
sum[x][]++;
sum[x][]++;
cout<<sum[f[f[x]]][]+sum[f[x]][]+sum[x][]<<endl;
}
return ;
}
最新文章
- SQL server2008-对象资源管理器
- 8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解
- IBatis 简易框架搭建
- BestCoder Round #90 //div all 大混战 一题滚粗 阶梯博弈,树状数组,高斯消元
- Java编程设计2
- JS点击任意标签获得该标签属性,以获得ID为例,以及AJAX的异步原理和 $(document).ready()与window.onload加载方法的区别
- [转]网站优化-IIS7下静态文件的优化
- pop动画大全 只能时代程序员更应该关心效果而不是冷冰冰的代码
- java获取远程网络图片文件流、压缩保存到本地
- python operator模块
- oschina Web应用开发
- 使用VS2010命令提示窗口操作程序集强命名
- split()方法
- FAT文件系统学习和思考
- SpringMVC(十二):SpringMVC 处理输出模型数据之@ModelAttribute
- sax
- Docker使用docker-compose.yml构建Asp.Net Core和Mysql镜像并与Mysql数据库通信
- web中的——作者也不知道这里面写的啥
- PHP算法排序之快速排序、冒泡排序、选择排序、插入排序性能对比
- windows删除文件或目录CMD命令