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. 错误修正记录:对应的VMware Tools脚本未能成功运行

    起因 装了台式机,想把笔记本里的vmware虚拟机迁移过来:复制过来后开机就出现这种情况,点开机.挂起.关机等操作会报错,然后无法挂起(再点一次就行) 或者使用下方的选项,而非上方包装过的功能,似乎也 ...

  2. sudo: unable to resolve host xxxx: Name or service not known

    前言 在 Linux 环境中,我使用 sudo 执行命令,发生报错:sudo: unable to resolve host xxxx: Name or service not known 解决 这个 ...

  3. Docker镜像相关-查看镜像信息

    主要涉及Docker镜像的ls.tag和inspect子命令. 使用images命令列出镜像 使用docker images或docker image ls命令可以列出本地主机上已有镜像的基本信息,字 ...

  4. 理解和使用Oracle 日志分析工具-LogMiner

      分类专栏: oracle日志   原文地址:https://blog.csdn.net/wishfly/article/details/660747 Oracle LogMiner 是Oracle ...

  5. emlog pro 文章编辑器(editor.md)的快捷键

    这里是一张图片,上面显示目前 emlog pro 编辑器所有**有效**的快捷键 (注意,是有效的快捷键,与 editor.md 官方公布的有出入,有些在系统是不可用的),对于长期使用emlog写作的 ...

  6. BUUCTF---异性相吸(欠编码)

    1.题目 ܟࠄቕ̐员䭜塊噓䑒̈́ɘ䘆呇Ֆ䝗䐒嵊ᐛ asadsasdasdasdasdasdasdasdasdasdqwesqf 2.知识 3.解题 很奇怪,不知道什么加密,借鉴网上参考,得知需将其转化为 ...

  7. 【JDBC第5章】批量插入

    第5章:批量插入 5.1 批量执行SQL语句 当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率 JDBC的 ...

  8. 话说Hangfire

    参考文档 www.hangfire.io github.com/HangfireIO/Hangfire .NET Core开源组件:后台任务利器之Hangfire

  9. restful 服务器一个问题,看ChatGPT的威力

    看看是否牛逼: 真不是写代码的料,也没有这样的天赋,仅仅玩玩而已. 问题:客户端边缘路由中一段js代码,使用get请求一个方法,把json数据送入数据库相关表.由于种种原因导致长连接,通过资源管理器可 ...

  10. 学习unigui【23】uniDBGrid的使用摘要

    Unidbgrid自动调整列宽 UniDBGrid1 -> ClientEvents -> ExtEvents [Ext.data.Store[store] ] add store.loa ...