CF1928G Vlad and Trouble at MIT

Vlad and Trouble at MIT

Problem

MIT的学生宿舍可以用一棵有\(n\)个顶点的树来表示,每个顶点代表一个房间,每个房间一个学生。

今晚,有三种类型的学生:

  • 想参加派对和玩音乐的学生(标记为 \(\texttt{P}\) )
  • 想睡觉和享受安静的学生(标记为 \(\texttt{S}\) )
  • 无所谓的学生(标记为 \(\texttt{C}\) )。

开始时所有的边缘都是薄墙,允许音乐通过,因此当参加派对的学生放音乐时,每个房间都能听到。但是,我们可以在任何边缘放置一些厚墙--厚墙不允许音乐通过。

学校希望安装一些厚墙,这样每个参加派对的学生都可以播放音乐,而睡觉的学生却听不到。

最少需要多少厚墙?

\(1 \leq t \leq 1000\)

\(2 \leq \sum n \leq 10^5\)

Wrong Solution

选择最少条边,将所有的P和S隔开。此时C是无所谓的。

如果这张图里面没有C,只有P和S的话,那么这棵树就是将将所有P-S边封上即可;

假如有C呢?我先想到了贪心+给C-C缩成一个C。结果缩点都写完了,突然发觉这贪心是伪的(也许有真的贪心吧)

Solution

树型dp。

任选一个节点作为根节点。设dp[i]表示以i为根节点的子树目前是被谁占领的(1表示P,2表示S,3表示无所谓)

dfs这棵树,先到叶子节点,叶子节点的占领情况自然就是这一节点本身的值。

回溯到点x,分为几种情况:

  • 节点本身为C,即无所谓。

    此时需要考虑各个子树之间的互相影响。

    统计子树的dp,看看各个子树目前的占领情况。

    1. 若子树中PS一样多

      那么让P占领自身与让S占领自身的花费都是一样的。所以设dp[x]为0,即无所谓。(由上游摆布)

    2. 若子树中PS不一样多

      优先给数量少的子树封上硬墙,并且点x被数量多的那种占领。

  • 节点本身不为C

    那么点x自然只能被其本身的学生类型所占领。

    并且所有与之互斥的子树都需要加墙,无所谓的子树则不用

时间复杂度\(O(tn)\)

Code

#define N 100010

int t;
int n;
vector<int>e[N];
char ch[N];
int dp[N];
int ans;
void dfs(int x,int f)
{ if(e[x].size()==1&&x!=1)
{
if(ch[x]=='P') dp[x]=1;
else if(ch[x]=='S') dp[x]=2;
else dp[x]=0;
return;
} int v;
int cnt[3]={0,0,0};
for(int i=0;i<e[x].size();i++)
{
v=e[x][i];
if(v==f) continue;
dfs(v,x);
cnt[dp[v]]++;
}
if(ch[x]=='C')
{
ans+=min(cnt[1],cnt[2]);
if(cnt[1]==cnt[2])
{
dp[x]=0;
}
if(cnt[1]>cnt[2])
{
dp[x]=1;
}
if(cnt[1]<cnt[2])
{
dp[x]=2;
}
}
else if(ch[x]=='P')
{
ans+=cnt[2];
dp[x]=1;
}
else{
ans+=cnt[1];
dp[x]=2;
} }
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=2;i<=n;i++)
{
int x;cin>>x;
e[x].push_back(i);
e[i].push_back(x);
}
string str;cin>>str;
for(int i=1;i<=n;i++) ch[i]=str[i-1]; dfs(1,0);
cout<<ans<<endl; for(int i=1;i<=n;i++) e[i].clear(),dp[i]=0;
ans=0;
}
return 0;
}

Referance

CJQ

CF1928G Vlad and Trouble at MIT的更多相关文章

  1. [转载]一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

    本文转载自:http://blog.csdn.net/testcs_dn/article/details/38496107 开源许可证GPL.BSD.MIT.Mozilla.Apache和LGPL的区 ...

  2. 五种开源协议(GPL,LGPL,BSD,MIT,Apache)

    什么是许可协议? 什么是许可,当你为你的产品签发许可,你是在出让自己的权利,不过,你仍然拥有版权和专利(如果申请了的话),许可的目的是,向使用你产品的人提供 一定的权限. 不管产品是免费向公众分发,还 ...

  3. 开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

    以下是上述协议的简单介绍:BSD开源协议BSD开源协议是一个给于使用者很大自由的协议.基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布. 但”为 ...

  4. Also unsere eigene Christian Louboutin Webshop bietet die überragende Christian Louboutin Schuhe uk schiebt zusammen mit kostengünstigen Wert

    www.heelschuhe.de, Es ist wirklich eine der Frauen erfordern immer interessant und auch Louboutin Pu ...

  5. MIT JOS学习笔记03:kernel 02(2016.11.08)

    未经许可谢绝以任何形式对本文内容进行转载! 本篇接着上一篇对kernel的分析. (5)pte_t * pgdir_walk(pde_t *pgdir, const void *va, int cre ...

  6. MIT JOS学习笔记01:环境配置、Boot Loader(2016.10.22)

    未经许可谢绝以任何形式对本文内容进行转载! 一.环境配置 关于MIT课程中使用的JOS的配置教程网上已经有很多了,在这里就不做介绍,个人使用的是Ubuntu 16.04 + qemu.另注,本文章中贴 ...

  7. [转]五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)

    当Adobe.Microsoft.Sun等一系列巨头开始表现出对"开源"的青睐时,"开源"的时代即将到来!现今存在的开源协议很多,而经过Open Source ...

  8. MIT License

    早上看到微软的UWP例子,在代码里看到 Copyright (c) Microsoft. All rights reserved.// This code is licensed under the ...

  9. 【BZOJ-1863】trouble 皇帝的烦恼 二分 + DP

    1863: [Zjoi2006]trouble 皇帝的烦恼 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 559  Solved: 295[Submit] ...

  10. MIT Scheme 使用 Edwin

    MIT Scheme 的基本使用:http://www.math.pku.edu.cn/teachers/qiuzy/progtech/scheme/mit_scheme.htm 安装过程 安装bre ...

随机推荐

  1. httprunner 断言报错 expect_value 和check_value类型不一致

    csv 源码 drillCode,drillName,code,msg y500,牙轮500,200,操作成功 YL201,牙轮201,500,牙轮编号已存在 运行后报错 E httprunner.e ...

  2. idea 登录提示Server's certificate is not trusted

    原因:你本地的idea证书不可以 解决方式1: 你去安装一个正版的: 解决方式2: 设置接受不受信任证书即可. AS:File - Settings - Tools - Server Certific ...

  3. go-ini 中文文档

    简介 地表 最强大.最方便 和 最流行 的 Go 语言 INI 文件操作库 灵活的数据源 不光光可以从文件读取配置,还支持 []byte 类型的纯数据读取和基于 io.ReadCloser 的流式读取 ...

  4. Windows下PostgreSQL设置远程连接以及备份和恢复数据库

    一.设置远程连接 修改安装路径下的postgresql.conf,定位到listen_address  = '*',确保其值为'*'(Windows下默认是这样的,可不用修改) 修改安装路径下的pg_ ...

  5. BUUCTF---rsa2

    题目 N = 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241 ...

  6. 面试题-Storm框架

    前言 Storm框架在实际项目中已经平稳运行快一年了,也很好的支撑了海量读写器的数据处理需求,不过和RabbitMQ一样,为了项目进度,实际工作中只能尽快的调研,关注一些关键点,其他的细节就只能放一放 ...

  7. ISODate时间转换

    private function formatISODate($dateTime) { $date = date("Y-m-d", strtotime($dateTime)); $ ...

  8. Web前端入门第 23 问:CSS 选择器的优先级

    任何地方都存在阶级,CSS 选择器也不例外,也会讲一个三六九等. 选择器类别 通配符选择器 标签选择器 类选择器 ID选择器 属性选择器 伪类选择器 伪元素选择器 关系选择器 流传已久的阶级划分 选择 ...

  9. 解密prompt系列52. 闲聊大模型还有什么值得探索的领域

    在DeepSeek-R1的开源狂欢之后,感觉不少朋友都陷入了技术舒适区,但其实当前的大模型技术只是跨进了应用阶段,可以探索的领域还有不少,所以这一章咱不聊论文了,偶尔不脚踏实地,单纯仰望天空,聊聊还有 ...

  10. Composer的常用命令和关于在哪儿查看composer可用包列表的问题

    1.安装: composer的安装就不用多说了,官网下载,一路next 中途貌似要让选择php.exe的所在目录. 2.常用命令: 1).配置/取消国内镜像仓库 /*配置国内镜像*/ composer ...