5.29 省选模拟赛 树的染色 dp 最优性优化
LINK:树的染色
考场上以为这道题要爆蛋了 没想到 推出正解来了.
反正是先写了爆搜的 爆搜最近越写越熟练了
容易想到dp 容易设出状态 f[i][j]表示以i为根的子树内白色的值为j此时黑色的值怎么样。
可以发现 当白色值固定的时候黑色值可能有多个 所以合法不合法这个状态不太行。
可以上f[i][j][k]了 不过这样复杂度极高 转移很暴力 不一定能跑过40.
考虑 对于一个白色颜色和为j来说 那么黑色和 有k1 k2都是合法了 容易得到只有较小的一个才有用。
那么就有状态了 f[i][j]表示以i为根的子树内白色的值为j此时黑色和的最小值。
复杂度\(nv^2\)
不过对于链的情况 复杂度会进一步达到\(nv\)可以通过60分。
容易想到 最后的复杂度应该是nv的。
观察状态转移式 可以发现 儿子之中只有两种状态有效 一个是 f[tn][v[tn]] 一个是 f[tn][k]=v[tn]。
前者 只有一个值直接对父亲进行更新即可。后者显然最小k是最优的 也直接对父亲进行贡献即可。
综上复杂度为nv.
const int MAXN=1010;
int T;
int n,maxx,flag,len;
int f[MAXN][5003];//f[i][j]表示以i为根的子树内当白色的和为j时黑色的最小值.
int lin[MAXN],ver[MAXN],v[MAXN],nex[MAXN],g[5003];
inline void add(int x,int y)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
}
inline void dp(int x)
{
int mark=0;
go(x)
{
dp(tn);
if(!mark)rep(0,maxx,j)f[x][j]=f[tn][j];
else
{
int ww=INF;
rep(0,maxx,j)
{
g[j]=f[x][j],f[x][j]=INF;
if(f[tn][j]==v[tn]&&ww==INF)ww=j;
}
//rep(0,maxx,j)rep(0,j,k)f[x][j]=min(f[x][j],g[j-k]+f[tn][k]);
//容易想到对于某个儿子 如果其选择白色 显然只有f[v[x]]的状态有效.
//如果选择黑色 存在只有f[tn][j]=v[x]的状态有效.
//可以实现转移降低复杂度. 前者直接转移 后者找到最小的进行转移 可以证明是最优的.
if(f[tn][v[tn]]<INF)
{
rep(0,maxx,j)if(j+v[tn]<=maxx)f[x][j+v[tn]]=min(f[x][j+v[tn]],f[tn][v[tn]]+g[j]);
else break;
}
if(ww!=INF)
{
rep(0,maxx,j)if(j+ww<=maxx)f[x][j+ww]=min(f[x][j+ww],g[j]+f[tn][ww]);
else break;
}
}
mark=1;
}
if(!mark)f[x][v[x]]=0,f[x][0]=v[x];
else
{
rep(0,maxx,i)g[i]=f[x][i],f[x][i]=INF;
rep(0,maxx,i)
{
//当前选择白色
if(i<=v[x])f[x][v[x]]=min(f[x][v[x]],g[i]);
//当前选择黑色
f[x][i]=min(f[x][i],(g[i]<=v[x]?v[x]:INF));
}
}
}
int main()
{
freopen("coloring.in","r",stdin);
freopen("coloring.out","w",stdout);
get(T);
while(T--)
{
get(n);len=0;maxx=5000;flag=0;
rep(1,n,i)
{
lin[i]=0;
memset(f[i],0x3f,sizeof(f[i]));
}
rep(2,n,i)add(read(),i);
rep(1,n,i)get(v[i]);
dp(1);
rep(0,maxx,i)if(f[1][i]<INF)flag=1;
if(flag)puts("POSSIBLE");
else puts("IMPOSSIBLE");
}
return 0;
}
5.29 省选模拟赛 树的染色 dp 最优性优化的更多相关文章
- 5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集
LINK:波波老师 LINK:同bzoj 1396 识别子串 不过前者要求线性做法 后者可以log过.实际上前者也被我一个log给水过了. 其实不算很水 我自认跑的很快罢了. 都是求经过一个位置的最短 ...
- 省选模拟赛 4.26 T1 dp 线段树优化dp
LINK:T1 算是一道中档题 考试的时候脑残了 不仅没写优化 连暴力都打挂了. 容易发现一个性质 那就是同一格子不会被两种以上的颜色染.(颜色就三种. 通过这个性质就可以进行dp了.先按照左端点排序 ...
- 6.18 省选模拟赛 树 倍增 LCT
LINK:树 考虑暴力 保存每个版本的父亲 然后暴力向上跳.得分20. 考虑离线 可以离线那么就可以先把树给搞出来 然后考虑求k级祖先 可以倍增求. 如何判断合法 其实要求路径上的边的时间戳<= ...
- 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.
考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...
- 6.29 省选模拟赛 坏题 AC自动机 dp 图论
考场上随手构造了一组数据把自己卡掉了 然后一直都是掉线状态了. 最后发现这个东西不是subtask -1的情况不多 所以就没管无解直接莽 写题有点晚 故没调出来.. 考虑怎么做 容易想到建立AC自动机 ...
- 3.29省选模拟赛 除法与取模 dp+组合计数
LINK:除法与取模 鬼题.不过50分很好写.考虑不带除法的时候 其实是一个dp的组合计数. 考虑带除法的时候需要状压一下除法操作. 因为除法操作是不受x的大小影响的 所以要状压这个除法操作. 直接采 ...
- [NOI.AC省选模拟赛3.23] 染色 [点分治+BFS序]
题面 传送门 重要思想 真的是没想到,我很久以来一直以为总会有应用的$BFS$序,最终居然是以这种方式出现在题目中 笔记:$BFS$序可以用来处理限制点对距离的题目(综合点分树使用) 思路 本题中首先 ...
- 4.9 省选模拟赛 圆圈游戏 树形dp set优化建图
由于圆不存在相交的关系 所以包容关系形成了树的形态 其实是一个森林 不过加一个0点 就变成了树. 考虑对于每个圆都求出最近的包容它的点 即他的父亲.然后树形dp即可.暴力建图n^2. const in ...
- 5.15 省选模拟赛 容斥 生成函数 dp
LINK:5.15 T2 个人感觉生成函数更无脑 容斥也好推的样子. 容易想到每次放数和数字的集合无关 所以得到一个dp f[i][j]表示前i个数字 逆序对为j的方案数. 容易得到转移 使用前缀和优 ...
随机推荐
- HTML5(七)Web 存储
HTML5 Web 存储 HTML5 web 存储,一个比cookie更好的本地存储方式. 什么是 HTML5 Web 存储? 使用HTML5可以在本地存储用户的浏览数据. 早些时候,本地存储使用的是 ...
- 简单的JdbcUtil 类
import java.sql.*; /** JDBC工具类 */ public class JdbcUtil { /** * 获取数据库连接对象并返回 * * @return Connection对 ...
- sql语句replace函数的使用
SQL中的替换函数replace()使用 语法 REPLACE ( string_expression , string_pattern , string_replacement ) 参数 strin ...
- mysql-如何删除主从同步
我用 change master 语句添加了一个主从同步, change master to master_host='localhost',master_user='slave',master_p ...
- Python——assert、isinstance的用法
1.assert 函数说明: assert语句是一种插入调试断点到程序的一种便捷的方式. 使用范例 assert 3 == 3 assert 1 == True assert (4 == 4) pri ...
- Java实现上传文件到指定服务器指定目录(ChannelSftp实现文件上传下载)
package com.tianyang.task.utils; import java.io.File;import java.io.FileInputStream;import java.io.I ...
- 属性复制神器-mapstruct
我们之前说到项目中会用到各种object,vo,bo,dto等等.我们需要在不同的对象上复制属性. 一.BeanUtils和PropertyUtils 我们最常用的就是Common包里面的BeanUt ...
- 5 个 IDEA 必备插件,让效率成为习惯
IDEA 是最好的 IDE,谁赞成,谁反对? IDEA 是 Java 开发人员中最受欢迎和用户友好的 IDE 之一,它具有许多便利的功能,例如智能代码完成,自动执行繁琐的重复开发任务,因此它已成为 J ...
- hacknos靶机实战
工具: kali 192.168.1.6 nmap 打开使用nmap -sP 192.168.1.0/24 扫描活跃的主机 发现目标ip 使用nmap 查看开启了什么服务Nmap -v -A -PN ...
- java大数据最全课程学习笔记(1)--Hadoop简介和安装及伪分布式
Hadoop简介和安装及伪分布式 大数据概念 大数据概论 大数据(Big Data): 指无法在一定时间范围内用常规软件工具进行捕捉,管理和处理的数据集合,是需要新处理模式才能具有更强的决策力,洞察发 ...