CF1928G Vlad and Trouble at MIT
CF1928G 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,看看各个子树目前的占领情况。若子树中
P与S一样多那么让
P占领自身与让S占领自身的花费都是一样的。所以设dp[x]为0,即无所谓。(由上游摆布)若子树中
P与S不一样多优先给数量少的子树封上硬墙,并且点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的更多相关文章
- [转载]一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
本文转载自:http://blog.csdn.net/testcs_dn/article/details/38496107 开源许可证GPL.BSD.MIT.Mozilla.Apache和LGPL的区 ...
- 五种开源协议(GPL,LGPL,BSD,MIT,Apache)
什么是许可协议? 什么是许可,当你为你的产品签发许可,你是在出让自己的权利,不过,你仍然拥有版权和专利(如果申请了的话),许可的目的是,向使用你产品的人提供 一定的权限. 不管产品是免费向公众分发,还 ...
- 开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
以下是上述协议的简单介绍:BSD开源协议BSD开源协议是一个给于使用者很大自由的协议.基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布. 但”为 ...
- 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 ...
- MIT JOS学习笔记03:kernel 02(2016.11.08)
未经许可谢绝以任何形式对本文内容进行转载! 本篇接着上一篇对kernel的分析. (5)pte_t * pgdir_walk(pde_t *pgdir, const void *va, int cre ...
- MIT JOS学习笔记01:环境配置、Boot Loader(2016.10.22)
未经许可谢绝以任何形式对本文内容进行转载! 一.环境配置 关于MIT课程中使用的JOS的配置教程网上已经有很多了,在这里就不做介绍,个人使用的是Ubuntu 16.04 + qemu.另注,本文章中贴 ...
- [转]五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
当Adobe.Microsoft.Sun等一系列巨头开始表现出对"开源"的青睐时,"开源"的时代即将到来!现今存在的开源协议很多,而经过Open Source ...
- MIT License
早上看到微软的UWP例子,在代码里看到 Copyright (c) Microsoft. All rights reserved.// This code is licensed under the ...
- 【BZOJ-1863】trouble 皇帝的烦恼 二分 + DP
1863: [Zjoi2006]trouble 皇帝的烦恼 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 559 Solved: 295[Submit] ...
- MIT Scheme 使用 Edwin
MIT Scheme 的基本使用:http://www.math.pku.edu.cn/teachers/qiuzy/progtech/scheme/mit_scheme.htm 安装过程 安装bre ...
随机推荐
- xpath 定位单选框
分析页面结构: 整个页面只有一组radiogroup 一个group地下存在两个radio 思路定位到页面唯一元素->下面具体radio 代码: //div[@class='el-radio-g ...
- # 如何引进高级的 IT 自动化项目:一个 3 步走计划
如果您的团队与大多数 IT 组织一样,您的团队正在执行某种形式的自动化(包括开发和运营),即使只是运行简单的脚本来完成基本任务. 事实上,开始自动化之旅的最佳地点是执行普通的.低技能的任务,例如密码重 ...
- 华为平板+Zotero+Xodo+坚果云+Zotfile+Zotero OCR,实现论文笔记平板手写+Win自动生成,补充官方教程
需要的硬件,软件,插件和实现的最终效果,rt. 1. Win,下载Zotero,坚果云 下载网址:https://www.zotero.org/download/ 版本:Zotero 6.如果是其他版 ...
- PV、UV、VV、IP含义及计算方式
什么是PV? PV 即 Page View,网站浏览量,指页面浏览的次数,用以衡量网站用户访问的网页数量. 用户每次打开一个页面便记录1次PV,多次打开同一页面则浏览量累计.一般来说,PV与来访者的数 ...
- npm ERR! request to https://registry.npm.taobao.org/axios failed, reason: certificate has expired
前言 一直使用 npm build没问题的,突然出现报错: npm WARN install Usage of the `--dev` option is deprecated. Use `--onl ...
- crontab使用路径的问题
crontab工具的一个大问题就是不能支持相对路径,会导致文件不能找到,在crontab启用脚本中加入cd指令,使得工作目录切换到运行工具所需的目录,即可 * 定时任务 每天凌晨0点执行 * 00 0 ...
- Docker swarm集群增加节点
docker swarm初始化 docker swarm init docker swarm 增加节点 在已经初始化的机器上执行:# docker swarm join-token manager T ...
- 【Linux】5.6 Shell打印输出指令
Shell打印输出命令 1. echo命令 Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出.命令格式:echo string 您可以使用echo实现更复杂的输出 ...
- Windows体验-注册表
打开方式中关闭在应用商店查找关联应用 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Explorer NoUseStoreOpenWit ...
- Sentinel源码—9.限流算法的实现对比
大纲 1.漏桶算法的实现对比 (1)普通思路的漏桶算法实现 (2)节省线程的漏桶算法实现 (3)Sentinel中的漏桶算法实现 (4)Sentinel中的漏桶算法与普通漏桶算法的区别 (5)Sent ...