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

P8127 [BalticOI 2021] The Xana coup (Day2) 分析

题目概述

给你一颗树并且每个点上面有点权,你可以进行一次操作:选择一个点将他自己和与他距离为 \(1\) 的点的点权全部异或 \(1\)

求最少多少次操作使得每个点的点权都是 \(0\)

分析

遇到这种题目,一般都是先考虑贪心或者基本算法。

我们考虑从下往上依次使其子树变成 \(0\),我们发现这是可以的,但是却不好判断无解,而且存在非最优解的情况。

所以我们再考虑 \(dp\)

这类题目一般都是每个点最多改变 \(1\) 次,为什么呢?我要是改变了两次不久相当于没有改变吗。

注意到我们如果从下往上的话,我们的改变实际上只是跟自己的儿子是否变化有关。

考虑维护这样一个 \(dp\)

\(f_{i,0/1,0/1}\) 表示以 \(i\) 为子树,当前 \(i\) 是否改变,\(i\) 的权值是什么并且使得整个子树除了它都是 \(0\) 的最小操作次数。

转移一一考虑即可(以下记 \((a,b,c)\) 表示 \(f_{a,b,c}\)\(j\)\(i\) 的儿子)。

第一种情况:\((i,0,0)\),那么我可以一开始是 \(1\) 但是被我的儿子改变(也就是 \((j,1,0)\)),或者说我一开始是 \(0\) 没有被我的儿子改变(也就是 \((j,0,0)\))。

第二种情况:\((i,0,1)\),那么我可以一开始是 \(0\) 但是被我的儿子改变(也就是 \((j,1,0)\)),或者说我一开始是 \(1\) 没有被我的儿子改变(也就是 \((j,0,0)\))。

第三种情况:\((i,1,0)\),那么我可以一开始是 \(0\) 但是我改变之后就变成了 \(1\),又被我的儿子改变回来了(也就是 \((j,1,1)\)),或者说我一开始是 \(1\) 然后是我自己改变的(也就是 \((j,0,1)\))。

第三种情况:\((i,1,1)\),那么我可以一开始是 \(0\) 但是我改变之后就变成了 \(1\),我的儿子没有改变我(也就是 \((j,0,1)\)),或者说我一开始是 \(1\) 然后改变之后变成了 \(0\),我的儿子改变了我(也就是 \((j,1,1)\))。

直接做就行了。

代码

时间复杂度 \(\mathcal{O}(n)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#define int long long
#define N 100005
using namespace std;
int f[N][2][2],a[N],n;
vector<int> g[N];
void dfs(int cur,int fa) {for (auto i : g[cur])if (i != fa) {dfs(i,cur);int _00 = f[i][0][0],_01 = f[i][0][1],_10 = f[i][1][0],_11 = f[i][1][1];int lst00 = f[cur][0][0],lst01 = f[cur][0][1],lst10 = f[cur][1][0],lst11 = f[cur][1][1];f[cur][0][0] = min(lst00 + _00,lst01 + _10);f[cur][0][1] = min(lst00 + _10,lst01 + _00);f[cur][1][0] = min(lst10 + _01,lst11 + _11);f[cur][1][1] = min(lst10 + _11,lst11 + _01);}
}
signed main(){cin >> n;for (int i = 1;i <= n;i ++) for (int j = 0;j < 2;j ++)for (int k = 0;k < 2;k ++) f[i][j][k] = 1e13;for (int i = 1;i < n;i ++) {int u,v;scanf("%lld%lld",&u,&v);g[u].push_back(v);g[v].push_back(u);}for (int i = 1;i <= n;i ++) scanf("%lld",&a[i]),f[i][0][a[i]] = 0,f[i][1][a[i] ^ 1] = 1;dfs(1,0);int ans = min(f[1][1][0],f[1][0][0]);if (ans <= n) cout << ans;else puts("impossible");return 0;
}
http://www.gsyq.cn/news/49408.html

相关文章:

  • 2025年靠谱的印花丝绒厂家最新热销排行
  • 2025 年市面上做得好的雅思培训机构哪家强,雅思口语专项 / 写作提分 / 听力精听 / 阅读技巧 / 机考冲刺 / 封闭集训培训哪家好
  • 2025年热门的耐溶剂涂料厂家推荐及选择指南
  • 2025年11月余热锅炉厂家榜:A级资质与模块化方案全面评测
  • 实用指南:Linux中slab缓存初始化kmem_cache_init函数和定时回收函数的实现
  • 2025年比较好的冲压钨钢模具材料最新TOP品牌厂家排行
  • 2025年口碑好的西安LMZK-10型电流互感器行业内知名厂家排行榜
  • 2025上海口碑最好的留学机构排名榜单
  • 2025年比较好的不锈钢厨具厂家最新推荐排行榜
  • 完整教程:动态规划经典算法实战:矩阵连乘与最长公共子序列
  • 2025年热门的进口品牌集成阻尼铰链厂家最新TOP实力排行
  • AWS iOS SDK 开发指南:构建云端移动应用的完整解决方案
  • DDR4仿真之仿真环境搭建(二)
  • 2025年评价高的悍高同款衣帽间收纳精品推荐榜
  • 2025年生态花岗石定做厂家权威推荐榜单:生态地铺石/石英砖/陶瓷PC砖源头厂家精选
  • 2025年淬火油冷却塔订制厂家权威推荐榜单:PAG冷却塔/无锡冷却塔/封闭式凉水塔源头厂家精选
  • PVE中,在CPU为非HOST模式下,SR-IOV直通显卡代码43问题的解决方法
  • 2025年比较好的成都中空板厂家最新推荐权威榜
  • 2025年靠谱的高速提升机TOP品牌厂家排行榜
  • 2025人工智能教育最新top5推荐:深度解析产业适配与教学实力
  • 2025年公交站台制造厂推荐指南:行业前十强排名分析
  • 国产化Excel开发组件Spire.XLS教程:Python将列表导出为CSV文件(含一维/二维/字典列表)
  • 2025 最新杭州办公室出租公司推荐!涵盖生态化服务、定制化空间及增值服务优选指南杭州租办公室/杭州租赁办公室/杭州办公室租赁公司推荐
  • 2025年湖南正规1688代运营公司权威推荐榜单:1688公司代运营/长沙1688代运营服务/长沙1688代运营源头公司精选
  • 2025 最新隔层纸厂家权威推荐榜:玻璃 / 防静电 / PCB / 防潮 / 电路板隔层纸优质企业综合排行
  • 2025年口碑好的八头激光切割机厂家推荐及采购指南
  • 2025年11月性价比高的学习机品牌推荐:权威对比排行榜及质量可靠性指南
  • WTAPI框架微信开发文档
  • 2025 年 11 月潜孔钻机厂家推荐排行榜:潜孔钻,150潜孔钻机,高气压环形潜孔钻机,150钻机专业选购指南
  • 2025年比较好的反弹抽屉滑轨厂家最新推荐权威榜