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

Atcoder [ARC161C] Dyed by Majority (Odd Tree) 题解 [ 绿 ] [ 树的遍历 ] [ 构造 ] [ 贪心 ]

Dyed by Majority (Odd Tree)

想起来无聊,写起来恶心。

首先手模一下,发现叶子节点可以确定它父亲的颜色。这启示我们自底向上确定颜色

因此考虑在已确定所有儿子的颜色时,确定自己的颜色,此时有两种情况:

  • 儿子中两种颜色出现次数相等:此时自己被染成什么颜色取决于父节点是什么颜色。因此可以直接求出父节点被涂成的颜色。
  • 儿子中两种颜色出现次数不相等:此时自己父亲的颜色不会影响自己的颜色。而为了尽可能满足父节点的要求,因此可以将自己的颜色染为父节点的颜色。

最后判断构造是否合法即可。时间复杂度 \(O(n)\)

#include <bits/stdc++.h>
#define fi first
#define se second
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define lc(x) (tr[x].ls)
#define rc(x) (tr[x].rs)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi = pair<int, int>;
const int N = 200005;
int n;
bitset<N> col;
int dp[N], tot[N][2], ans[N];
vector<int> g[N];
bool ilg = 0;
void dfs(int u, int fa)
{for(auto v : g[u]){if(v == fa) continue;dfs(v, u);}if(dp[u])tot[fa][ans[u]]++;else{ans[u] = col[fa];tot[fa][ans[u]]++;}if(tot[u][0] == tot[u][1]){int res = col[u];if(dp[fa] && ans[fa] != res) ilg = 1;dp[fa] = 1;ans[fa] = res;}else{if(col[u] == 0 && tot[u][0] < tot[u][1]) ilg = 1;if(col[u] == 1 && tot[u][0] > tot[u][1]) ilg = 1;}
}
void solve() 
{cin >> n;for(int i = 0; i <= n; i++){g[i].clear();dp[i] = tot[i][0] = tot[i][1] = 0;}for(int i = 1; i < n; i++){int u, v;cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}for(int i = 1; i <= n; i++){char c;cin >> c;col[i] = (c == 'B');}ilg = 0;dfs(1, 0);if(ilg || dp[0]){cout << "-1\n";return;}for(int i = 1; i <= n; i++){if(ans[i]) cout << 'B';else cout << 'W';}cout << "\n";
}
int main()
{//freopen("sample.in", "r", stdin);//freopen("sample.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;cin >> t;while(t--) solve();return 0;
}
http://www.jsqmd.com/news/31554/

相关文章:

  • Reflections on Trusting Trust by Ken Thompson
  • [Agent] ACE(Agentic Context Engineering)源码阅读笔记---(1)基础模块
  • AI大语言模型从0开发
  • 做题笔记22
  • 第三十三篇
  • 2025.11.4
  • 25.11.4 动态规划dp
  • EAS_提供多个单据详情查询接口数据给第三方进行单据查看
  • 顺序结构及选择结构
  • 洛谷 P10894
  • 基本的方法
  • 2025.11.4模拟赛总结
  • 备考笔记7
  • 服务器取证基本知识学习
  • 实用指南:【18】C实战篇——C语言 文件读写【fputc、fgetc、fputs、fgets】
  • 详细介绍:常见反爬虫策略与破解方案汇总
  • 初始three.js
  • 2025 年 11 月财税合规审计报告服务商权威推荐榜:专业审计、税务合规、财务风控,企业财税合规审计报告公司精选
  • 2025 年 11 月财税合规服务厂家推荐排行榜,电商/跨境电商/出口退税/股权设计/平台报送/亚马逊/Temu/1039/海外公司/审计报告全案解决方案
  • 2025 年 11 月一般纳税人财税合规服务商权威推荐榜:专业税务筹划与合规管理解决方案深度解析
  • AI分为ANI和AGI
  • L09_ java内注解反射的简单理解(作为小白,菜鸟的理解)
  • P5369 最大前缀和
  • 奋飞咨询:以专业之光,照亮企业可持续发展通途
  • 日总结 21
  • cpp生成1到n生成全排列的三种方法
  • CF1815D
  • 南京大学/NJU 人工智能/AI 计算机系统基础/ICS 编程作业/PA 记录
  • 直播带货话术不会写?这个AI指令帮你搞定
  • Java数组——数组的使用