当前位置: 首页 > article >正文

#Z2322. 买保险

一.题目

二.思路

1.暴力

训练的时候,初看这道题,这不就打个暴力吗?

 2.暴力代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,fa,x,y,vis[1000001],ans;
vector<int> vec[1000001];
void dfs(int x,int y)
{
	if(y == -1) return ;
	vis[x] = 1;
 for(int i = 0;i < vec[x].size();i++) dfs(vec[x][i],y - 1);
}
signed main()
{
  cin>>n>>m;
  for(int i = 2;i <= n;i++)
  {
    cin>>fa;
	vec[fa].push_back(i);
  }
  while(m--)
  {
    cin>>x>>y;
	dfs(x,y);
  }
  for(int i = 1;i <= n;i++)
	    if(vis[i])
			ans++;
  cout<<ans;
  return 0;
}

结果。。。

3.正解

赛后仔细研究了一下,其实也不难,只要借鉴一下线段树lazy标记的思想,打个标记,dfs的时候下传就行了。细节有点多,可以看看代码。

4.代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,fa,x,y,vis[1000001],ans,t[1000001];
vector<int> vec[1000001];
void dfs(int x,int fa,int y)
{
  t[x] = max(t[x],y);//因为有可能父节点下传了保险,自己也买了一份保险
	if(t[x]) vis[x] = 1;
 for(int i = 0;i < vec[x].size();i++)
   if(fa != vec[x][i])
   {
     if(t[x] - 1 >= 0) dfs(vec[x][i],x,t[x] - 1);
     else dfs(vec[x][i],x,0);
   }
}
signed main()
{
  cin>>n>>m;
  for(int i = 2;i <= n;i++)
  {
    cin>>fa;
	vec[fa].push_back(i);
	vec[i].push_back(fa);
  }
  while(m--)
  {
    cin>>x>>y;
    y++;
    t[x] = max(t[x],y);//因为一个人有可能买多份保险,所以要取其中往后最多的子孙的那一份
  }
  dfs(1,0,0);
  for(int i = 1;i <= n;i++)
	    if(vis[i])
			ans++;
  cout<<ans;
  return 0;
}

 三.结语

如果这篇博客对您有帮助的话,请点个赞支持一下吖!( •̀ ω •́ )✧


http://www.kler.cn/a/234651.html

相关文章:

  • 无人机动力测试台如何快速外接第三方传感器
  • 杨辉三角-一维数组与二维数组解法
  • 完整培训教程:骨折图像分割
  • 阿里公告:停止 EasyExcel 更新与维护
  • 蓝桥杯备考——算法
  • PyQt5超详细教程终篇
  • 【自然语言处理-工具篇】spaCy<2>--模型的使用
  • 请解释Java中的代理模式,分别介绍静态代理和动态代理
  • WindowsLinuxmeterepreter渗透命令回顾
  • windows 下安装gin
  • PKI - 借助Nginx实现_客户端使用CA根证书签发客户端证书
  • django中实现适配器模式
  • python基于flask的网上订餐系统769b9-django+vue
  • SNMP(简单网络管理协议)介绍
  • 【每日一题】04最小路径和 (DP3)
  • 【C语言】(20)动态内存分配
  • HiveQL——不借助任何外表,产生连续数值
  • Linux CentOS stream 9 alias
  • 【JavaScript 漫游】【014】正则表达式通关
  • VitePress-14- 配置-titleTemplate 的作用详解
  • 2.11学习总结
  • Redisson分布式锁 原理 + 运用 记录
  • CentOS基于volatility2的内存取证实验
  • bcdedit /store 填什么,Windows11的BCD文件在哪里?
  • CrossOver虚拟机软件功能相似的软件
  • 6.JavaScript中赋值运算符,自增运算符,比较运算符,逻辑运算符