题意:有 nnn 个城市连成一棵树,每个城市有 aia_iai​ 个人。接下来 mmm 天每天会发生 kik_iki​ 次灾难,每个灾难会让一个给定城市的人全部死掉。每个人一天可以走一条边,也可以不动。求最多多少人能活过这 mmm 天。

n≤106,∑ki≤2×106n\leq 10^6,\sum k_i\leq 2\times 10^6n≤106,∑ki​≤2×106

倒过来考虑,维护在哪些位置的人可以活到最后,相当于要支持以下操作

  1. 把一个点染黑。
  2. 所有白点扩展 111 步。

对于 222 操作,一个黑点会变白当且仅当和一个原来的白点相邻。考虑分别维护这个白点是父亲还是儿子。

需要维护的东西:

huh_uhu​ 表示真实情况下 uuu 的白儿子个数。

nnn 个 vector 记录每个点 可能 需要被自己更新为白点的所有黑儿子。

封装两个线性结构 q,sqq,sqq,sq ,记录可能会被儿子更新为白点的结点、可能会用来更新黑儿子的结点。

染黑的时候,自己进 qqq,父亲进 sqsqsq,更新父亲的 hhh 和 vector。

然后这一天的行动,把 qqq 和 sqsqsq 一个个取出来判断是否合法并更新自己或 vector 中的儿子,需要染白的记下来稍后处理。

染白的时候,自己进 sqsqsq,父亲进 qqq,更新父亲的 hhh。因为这里更新不了 vector,只能不删,所以不能用 vector 的大小来代替 hhh。

复杂度 O(n+m+∑ki)O(n+m+\sum k_i)O(n+m+∑ki​)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
#define MAXN 1000005
using namespace std;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
typedef long long ll;
vector<int> e[MAXN],lis[MAXN],son[MAXN];
int a[MAXN],col[MAXN],fa[MAXN],h[MAXN];
struct que
{int a[MAXN],vis[MAXN],cnt;inline void push(int x){if (!vis[x]) vis[a[++cnt]=x]=1;}inline int pop(){if (cnt) return vis[a[cnt]]=0,a[cnt--];return 0;}
}q,sq,ans;
void dfs(int u,int f){fa[u]=f;for (int i=0;i<(int)e[u].size();i++) if (e[u][i]!=f) ++h[u],dfs(e[u][i],u);}
inline void die(int u)
{if (col[u]) return;col[u]=1;q.push(u);if (fa[u]){son[fa[u]].push_back(u),--h[fa[u]];sq.push(fa[u]);}
}
inline void live(int u)
{if (!col[u]) return;col[u]=0,sq.push(u);if (fa[u]) ++h[fa[u]],q.push(fa[u]);
}
int main()
{int n,m;n=read(),m=read();for (int i=1;i<=n;i++) a[i]=read();for (int i=1;i<n;i++){int u,v;u=read(),v=read();e[u].push_back(v),e[v].push_back(u);}dfs(1,0);for (int i=1;i<=m;i++){lis[i].resize(read());for (int j=0;j<(int)lis[i].size();j++) lis[i][j]=read();}for (int T=m;T>=1;T--){for (int i=0;i<(int)lis[T].size();i++) die(lis[T][i]);for (int u=q.pop();u;u=q.pop()) if (h[u]) ans.push(u);for (int u=sq.pop();u;u=sq.pop()) if (!col[u]){for (int i=0;i<(int)son[u].size();i++)ans.push(son[u][i]);son[u].clear();              }for (int u=ans.pop();u;u=ans.pop()) live(u);}ll ans=0;for (int i=1;i<=n;i++) if (!col[i]) ans+=a[i];cout<<ans;return 0;
}

【启智树NOIP模拟】生存【父子分治】相关推荐

  1. 【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】

    题意:给定 nnn 个数 aia_iai​ ,求选出(可以重复,考虑顺序)MMM 个数和为 SSS 的方案数模 222. n≤200,ai≤105,M,S≤1018n\leq 200,a_i\leq ...

  2. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  3. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  4. 鸿蒙启智 博学多才,如何启智——【3岁阶段孩子的教养之63】

    前言:人生之始,犹如大厦之奠基,基牢则厦固.童年时代健康的体魄和健全的心理必将给他此后一生以正面的影响. 本文以时间为序,分别介绍0-9岁各年龄段孩子的身心发展特点,并以此为据,说明如何给孩子一个健康 ...

  5. 开源项目推荐 | 中科院自动化所历时9年打造的类脑认知智能引擎“智脉”正式开源部署至OpenI启智社区

    ​人脑能够自组织地协同数百项认知功能,灵活适应复杂多变的环境.如何整合多尺度生物可塑性法则来构建具有生物合理性和计算高效性的神经网络模型是类脑人工智能和计算神经科学领域共同关注和面临的重要挑战. 中国 ...

  6. 开源大咖齐聚2020启智开发者大会,共探深度学习技术未来趋势

    ​2020年12月2日,"OpenI/O 2020启智开发者大会"在北京国家会议中心召开.大会以"启智筑梦 开源先行"为主题,立足于国际国内开源大环境和发展趋势 ...

  7. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...

  8. 启智社区亮相2020全球智博会,千万奖金悬赏优秀开发者

    在新一代信息技术快速发展和开源生态体系不断完善的当下,开源在技术创新.生态构建.数字变革等方面,都发挥着重要的引领作用.2020全球人工智能产品应用博览会上,新一代人工智能产业技术创新战略联盟(AIT ...

  9. 还有 2 天,这场大咖云集的启智开发者大会即将启动!

    OpenI/O 2019 启智开发者大会 倒计时 2 天 在软件开发的道路上,开源如同一趟不可逆转.疾驰前行的列车,现在,越来越多的开发者搭上了这趟列车. 12月21日-22日,邀请您参加于深圳召开的 ...

最新文章

  1. Html报表用Excel打开保持表格线【Html报表模板】
  2. JavaScript初步入门
  3. cvm服务器怎么建网站,云服务器cvm快速入门教程
  4. mysql top virt_linux top命令VIRT,RES,SHR,DATA的含义
  5. 深入浅出hive-hive简介
  6. Windows Server 2008 活动目录备份的几种方法
  7. Android快速开发框架Android-query
  8. github库fork后,将更新提交到源库
  9. web功能测试工具_Web辅助功能:工具和注意事项
  10. lvds输入悬空_低压差分信号LVDS学习笔记-模拟/电源-与非网
  11. 为XYplorer添加右键菜单:“使用XYplorer打开”
  12. Mesos 1.1.1 发布说明
  13. 山东科技大学第二届ACM校赛解题报告
  14. 一,银行软件测试工作总结
  15. Microsoft 解决方案框架版本 3.0 概述(MSF3.0)
  16. 友价商城2019.2月最新版
  17. wisp5学习日记1
  18. 使用mycat实现分库分表
  19. 高通平台开发系列讲解(USB篇)Linux Android USB软件架构
  20. pta 6-8 使用函数求Fibonacci数 (15 分)

热门文章

  1. 被夸了几十年,地球都要因为它变秃了,你还天天用它......
  2. 他毕业于北师大,编写了我国首套数学教材,陈景润华罗庚都崇拜他
  3. 每日一笑 | 坐牢吗?学编程那种~
  4. navicat循环执行上下两行相减sql语句_SQL语句的优化分析
  5. r语言用行名称提取数据框信息显示na_学会这些R语言技巧至少可以节省半年时间...
  6. python if 跳出_Python保留字简单释义
  7. python调用robotframework_robotframework+python接口自动化的点滴记录(2)
  8. _云计算学习路线图素材课件,Linux中软件安装的方式
  9. 苏泊尔搭载华为鸿蒙系统,华为鸿蒙打算在一年内跨过生死线,拿下16%的市场份额...
  10. python os system_python中os. popen system的区别