2017.07.09【NOIP提高组】模拟赛B组
Summary
今天放假,比赛于是就没有打了,但是看了一下题,发现都挺简单了,不想码~╮(╯▽╰)╭懒虫一条。最后一题居然做过原题。这次比赛让我对并查集“刮目相看”,对贪心感到“前途无量”,觉得树形DP很有趣,但也很难,但也都打出来了。要多做关于树形DP的题目,来充实自己。
Problem
T1 【GDOI2003】购物
题目大意
给你很多种物品,你购买每个物品就可以剩下ai钱,但是编号x和y号物品,买了其一,就不能买其二,且不会出现一个环的情况。问最多能节省多少钱。
想法
这道题好像做过一道类似的题目,是“没有上司的舞会”,是我第一道树形DP的题目
方法有两种,两种都可以说一下:
(1)树形DP
分为两种情况,一种是没有限制的点,一种是有限制的点
①有限制的点
对于这一类点,我们可以把他们一串一串的连成一棵树,使之成为森林,然后,我们对于每一棵树进行树形DP,看看每一棵树,最多可以节省多少钱。
设f[i,0/1]表示选不选编号为i的点
如果选,那么它的儿子就不可以选,也可以说它的父亲不可以选,但是,我们在判断的父亲选时,那它就不能选了,所以我们只需要判断它的儿子不能选即可。
f[i,1]:=∑f[j,0](j为i的儿子),它的儿子只能不选,那么就看看不选时,每个儿子的最大值,求和即可
如果不选,那么它的儿子可以选或者不选,我们就判断一下它的儿子选还是不选,分两种情况讨论
f[i,0]:=∑max(f[j,0],f[j,1])(j为i的儿子)
套上树形DP千年不变的递归模型,求解就行了
②无限制的点
这类点直接加上他可以节省的钱数就可以了
(2)二分图+网络流
听大神们说,树形DP打多了,试试新口味
我也想打,但是,树(网)形(络)D(流)P(不)没(会)打(打)腻(啊)
T2 blockenemy
题目大意
给一个树,有些节点上有敌人,树边存在权值,先要删除若干条边,使得敌人各不相连的最小代价是多少?
想法
这道题是一道很好的树形DP练手题目,同时也可以用并查集+贪心来做,现在讲一下两种做法
(1)树形DP
设f[x]表示以x为根,它子树的敌人都不可以互相联络,且无法到达点x的最小价值
设g[x]表示以x为根,它子树的敌人都不可以互相联络,但是其中一个敌人可以到达x这个点的最小价值
这个状态设得异常巧妙,在我看过这道题的所有题解,这是最好理解的
其实,解题的关键,就是状态和转移上面了!
我们考虑两种情况,如果当前x上有敌人,或者没有敌人,应该怎么做。
①有敌人
如果有敌人,那么f[x]就赋值为无穷大,因为他根本不可以“无法到达点x”
这时,我们考虑g[x]给之后的转移用,到底g[x]应该是多少
显然是g[x]=∑min(f[y],g[y]+dis[x,y]),(y是x的儿子)为什么呢?
因为x这个点有敌人了,那么g[x]本身就符合条件了
因为f[y]的时候,没有点可以互相联络,如果多添一个点x,那么他就是g[x]的条件了,所以它是取最小值的两个数之一
因为g[y]已经符合条件了,如果多添一个点x,那么他就不符合g[x]的条件了,因为他有2个点可以到达x,所以我们需要x~y之间连一条边,保证只有1个点可以到达x
②无敌人
f[x]=∑min(f[y],g[y]+dis[x,y])(y是x的儿子)为什么呢?
跟上面g数组的转移差不多
f[y]是符合条件的,所以多添一个点还是fx的条件,所以是取最小值的两个数之一、
g[y]是不符合条件的,他有1个点可以到达x,所以x~y之间连一条边,保证没有点可以到达x
可是,这时,g[x]怎么做的?怎么转移是本题解题的关键所在
g[x]一定是在f[x]的基础上转移的!使得它的某个儿子不可以到达
其实,就是把f[x]中,一个花费最大的一次删除敌人到x的边的价值,删掉
重点
上面说了f[x]=min(f[y],g[y]+dis[x,y])(其中一个),我们把可以到达x这个点,变成不可以到达这个点,然后就有两种情况
一种就是g[y]+dis,如下图

试想一下,原本y点为根的子树是可以到达y的,但是删去了x~y之间的边就不可以到达了,也就是说,是从未知点~x~y的,是这样的顺序
还有一种情况就是f[y],同上图
就是原本的
我们由min(g[y]+dis,f[y])变成g[y]就是上面所说
f[x]就会在f[x]的基础上减去min(g[y]+ w, f[y]) – g[y],那么这个值越大,f[x]就会越小。
f[x]-g[y]就是那个让原本可以到y的,变成不能到y的那条边,f[x]-这条边的最大值,就是g[x]
显然是取最大值,这样g[x]就变得很小
我发个连续的段子,结合图片和f,g数组的定义看,一定可以看得懂
“G[x]的转移有那么一丢丢难想。G[x]一定实在f[x]的基础上,使得某个儿子从不能到达x,变成能到达x,即儿子y对该状态的贡献由min(g[y] + w, f[y])变为g[x].如果这样的话,f[x]就会在f[x]的基础上减去min(g[y]+ w, f[y]) – g[y],那么这个值越大,f[x]就会越小。”
(2)贪心+并查集
思想跟最小生成树一样,简直一模一样
可以通过O(n^2)判断加多一条边是否可以符合题目条件
边从大到小选
如果n大一点,上面的判断可以改成O(m)的,m是边数,根据深度来搜索每一个点。
T3 treecut
题目大意
给一棵无根树,删掉某一个点,使得每个连通块节点个数不大于原来节点个数的一半,求这些点
想法
我们试着让每一个点都当作根做一遍,用快速的方法来求每个连通块的个数即可,十分简单。
2017.07.09【NOIP提高组】模拟赛B组的更多相关文章
- 2017.1.16【初中部 】普及组模拟赛C组总结
2017.1.16[初中部 ]普及组模拟赛C组 这次总结我赶时间,不写这么详细了. 话说这次比赛,我虽然翻了个大车,但一天之内AK,我感到很高兴 比赛 0+15+0+100=115 改题 AK 一.c ...
- 2018.12.30【NOIP提高组】模拟赛C组总结
2018.12.30[NOIP提高组]模拟赛C组总结 今天成功回归开始做比赛 感觉十分良(zhōng)好(chà). 统计数字(count.pas/c/cpp) 字符串的展开(expand.pas/c ...
- ZROI提高组模拟赛05总结
ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生 ...
- NOIP2017提高组 模拟赛15(总结)
NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...
- NOIP2017提高组 模拟赛13(总结)
NOIP2017提高组 模拟赛13(总结) 第一题 函数 [题目描述] [输入格式] 三个整数. 1≤t<10^9+7,2≤l≤r≤5*10^6 [输出格式] 一个整数. [输出样例] 2 2 ...
- NOIP2017提高组模拟赛 10 (总结)
NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ...
- NOIP2017提高组模拟赛 8(总结)
NOIP2017提高组模拟赛 8(总结) 第一题 路径 在二维坐标平面里有N个整数点,Bessie要访问这N个点.刚开始Bessie在点(0,0)处. 每一步,Bessie可以走到上.下.左.右四个点 ...
- NOIP2017提高组模拟赛 9 (总结)
NOIP2017提高组模拟赛 9 (总结) 第一题 星星 天空中有N(1≤N≤400)颗星,每颗星有一个唯一的坐标(x,y),(1≤x,y ≤N).请计算可以覆盖至少K(1≤K≤N)颗星的矩形的最小面 ...
- NOIP2017提高组模拟赛 7(总结)
NOIP2017提高组模拟赛 7(总结) 第一题 斯诺克 考虑这样一个斯诺克球台,它只有四个袋口,分别在四个角上(如下图所示).我们把所有桌子边界上的整数点作为击球点(除了4个袋口),在每个击球点我们 ...
- NOIP2017提高组模拟赛5 (总结)
NOIP2017提高组模拟赛5 (总结) 第一题 最远 奶牛们想建立一个新的城市.它们想建立一条长度为N (1 <= N <= 1,000,000)的 主线大街,然后建立K条 (2 < ...
随机推荐
- 开始写博客,学习Linq
除了为处理数据提供全新的方法之外,LINQ还代表了一种朝着声明式以及函数式编程发展的转变. 当人们问我为什么要学习LINQ时,我会告诉他们LINQ可以处理XML.关系型数据以及内存中的集合,更会提到L ...
- 发送Json数据,WebApi查看时为Null的问题(已解决)
1. PostMan :发送请求的Body中选择form-data是不行的.,body中的内容也要选择raw json格式. 2.如果是代码中填写的对象,api中解析为null,说明字段的值未对 ...
- MySQL基础一(CMD使用)
概述 MySQL因可移植行高,安装简单小巧等优点被更多的开发者喜爱.执行MySQL的指令的方式有2种方式,方式一.MySQL的客户端软件比如navicat :方式二.通过Cmd命令: CMD命令执行方 ...
- python全栈开发day99-DRF序列化组件
1.解释器组件源码分析 https://www.processon.com/view/link/5ba0a8e7e4b0534c9be0c968 2.基于CBV的接口设计 1).django循环que ...
- tasksetCPU亲和力&docke容器资源限制
[taskset详解] taskset设置cpu亲和力,taskset能够将一个或者多个进程绑定到一个或者多个处理器上运行 参数: 选项: -a, --all-tasks 在给定 pid 的所有任务( ...
- 第一章:python基础语法| 字符编码| 条件语句...
1.编程语言介绍 编程就是写代码,让计算机帮你做事情.计算机底层是电路,只认识二进制0和1.机器语言&汇编语言语言进化历史:机器.汇编.高级.机器语言只接受二进制代码:汇编语言是采用英文缩写的 ...
- day28 面向对象:反射,内置函数,类的内置方法
面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...
- 00-JAVA语法基础--课后作业
题目:像二柱子那样,花20分钟写一个能自动生成30道小学四则运算题目的“软件”. package 课堂作业1; import java.util.Random; import java.util.Sc ...
- HDU 1175 连连看 (DFS+剪枝)
<题目链接> 题目大意:在一个棋盘上给定一个起点和终点,判断这两点是否能通过连线连起来,规定这个连线不能穿过其它的棋子,并且连线转弯不能超过2次. 解题分析:就是DFS从起点开始搜索,只不 ...
- Python虚拟环境的安装和配置-virtualenv与windows下多个python版本共存
Python虚拟环境的安装和配置-virtualenv与windows下多个python版本共存 windows下多个python版本共存 https://www.python.org/downloa ...