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 最优性优化的更多相关文章

  1. 5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集

    LINK:波波老师 LINK:同bzoj 1396 识别子串 不过前者要求线性做法 后者可以log过.实际上前者也被我一个log给水过了. 其实不算很水 我自认跑的很快罢了. 都是求经过一个位置的最短 ...

  2. 省选模拟赛 4.26 T1 dp 线段树优化dp

    LINK:T1 算是一道中档题 考试的时候脑残了 不仅没写优化 连暴力都打挂了. 容易发现一个性质 那就是同一格子不会被两种以上的颜色染.(颜色就三种. 通过这个性质就可以进行dp了.先按照左端点排序 ...

  3. 6.18 省选模拟赛 树 倍增 LCT

    LINK:树 考虑暴力 保存每个版本的父亲 然后暴力向上跳.得分20. 考虑离线 可以离线那么就可以先把树给搞出来 然后考虑求k级祖先 可以倍增求. 如何判断合法 其实要求路径上的边的时间戳<= ...

  4. 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.

    考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...

  5. 6.29 省选模拟赛 坏题 AC自动机 dp 图论

    考场上随手构造了一组数据把自己卡掉了 然后一直都是掉线状态了. 最后发现这个东西不是subtask -1的情况不多 所以就没管无解直接莽 写题有点晚 故没调出来.. 考虑怎么做 容易想到建立AC自动机 ...

  6. 3.29省选模拟赛 除法与取模 dp+组合计数

    LINK:除法与取模 鬼题.不过50分很好写.考虑不带除法的时候 其实是一个dp的组合计数. 考虑带除法的时候需要状压一下除法操作. 因为除法操作是不受x的大小影响的 所以要状压这个除法操作. 直接采 ...

  7. [NOI.AC省选模拟赛3.23] 染色 [点分治+BFS序]

    题面 传送门 重要思想 真的是没想到,我很久以来一直以为总会有应用的$BFS$序,最终居然是以这种方式出现在题目中 笔记:$BFS$序可以用来处理限制点对距离的题目(综合点分树使用) 思路 本题中首先 ...

  8. 4.9 省选模拟赛 圆圈游戏 树形dp set优化建图

    由于圆不存在相交的关系 所以包容关系形成了树的形态 其实是一个森林 不过加一个0点 就变成了树. 考虑对于每个圆都求出最近的包容它的点 即他的父亲.然后树形dp即可.暴力建图n^2. const in ...

  9. 5.15 省选模拟赛 容斥 生成函数 dp

    LINK:5.15 T2 个人感觉生成函数更无脑 容斥也好推的样子. 容易想到每次放数和数字的集合无关 所以得到一个dp f[i][j]表示前i个数字 逆序对为j的方案数. 容易得到转移 使用前缀和优 ...

随机推荐

  1. 资深前端工程师带你认识网页后缀html、htm、shtml、shtm有什么区别?

    每一个网页或者说是web页都有其固定的后缀名,不同的后缀名对应着不同的文件格式和不同的规则.协议.用法,最常见的web页的后缀名是.html和.htm,但这只是web页最基本的两种文件格式,今天我们来 ...

  2. 华山论剑(没有上司的舞会)——树形dp

    华山论剑(没有上司的舞会) 题目描述 一日,小策如往常一般打开了自己的传奇,刚上线不久,就收到了帮主的私信.原来帮派里要召开一次武功比拼,让他来邀请各帮派人员,因为有些侠客还是萌新,所以需要小策挨个选 ...

  3. 洛谷 P1220 关路灯 区间DP

    题目描述 某一村庄在一条路线上安装了 n 盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了 ...

  4. Vue 项目推荐,Github 过万 Star

    电鸭社区-远程工作-自由职业-兼职外包-自由从这开始 嗨,我是 Martin,也叫老王.不少小伙伴,说自己是转行.自学,没有项目,今天推荐一个 Vue 实战项目 还记得 Martin 仿写过在线 Ma ...

  5. Google 出品的 Java 编码规范,强烈推荐,既权威又科学

    这份文档是 Google Java 编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才认为它符合Google的Java编程风格.原文:google.github.io/st ...

  6. python网络编程01 /C/S架构|B/S架构、网络通信原理、五层协议、七层协议简述、端口映射技术

    python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述.端口映射技术 目录 python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述. ...

  7. 万字长文,62道Java核心面试题,一次性打包送给积极向上的你

    先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有一线大厂整理的面试题,以及我的系列文章. ...

  8. Quartz.Net系列(十六):Misfire策略在SimpleScheduler和CronScheduler中的使用

    1.场景 ①因为工作线程都在忙碌,所以导致某些Trigger得不到触发 也就是默认10个工作线程而我有15个Trigger同时触发 这就导致有5个不能被触发,而不幸的是Trigger所关联的Job执行 ...

  9. 并发编程AQS--------ReentrantLock

    同步框架AbstractQueuedSynchronizer Java并发编程核心在于java.concurrent.util包 而juc当中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列. ...

  10. vue : 本地调试跨域问题的解决办法:proxyTable

    本来我是不想写的,但为了加深印象还是写一写吧. ./config/index.js module.exports = { dev: { // Paths assetsSubDirectory: 'st ...