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. Ocelot网关+IdentityServer4实现API权限认证

    Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butterfly ...

  2. 如何实现 token 加密

    jwt举例 需要一个secret(随机数) 后端利用secret和加密算法(如:HMAC-SHA256)对payload(如账号密码)生成一个字符串(token),返回前端 前端每次request在h ...

  3. Python 读取Excel之xlrd篇

    上一期给大家分享了如何用Python读取文本,这次给大家分享如何读取Excel表格内容,拿最常见的.xlsx和.xls格式来讲解. 本章主要知识点有: 读取整篇excel返回list[list[lis ...

  4. web 部署专题(三):压力测试(一)工具 siege

    1.介绍 Siege是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访 ...

  5. 机器学习实战基础(十二):sklearn中的数据预处理和特征工程(五) 数据预处理 Preprocessing & Impute 之 处理分类特征:处理连续性特征 二值化与分段

    处理连续性特征 二值化与分段 sklearn.preprocessing.Binarizer根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量.大于阈值的值映射为1,而小于或等于阈值的值 ...

  6. JS中this指向的更改

    JS中this指向的更改 JavaScript 中 this 的指向问题 前面已经总结过,但在实际开中, 很多场景都需要改变 this 的指向. 现在我们讨论更改 this 指向的问题. call更改 ...

  7. 细说php锁

    bool flock ( int handle, int operation [, int &wouldblock] );flock() 操作的 handle 必须是一个已经打开的文件指针.o ...

  8. Nginx日志按天切割基本配置说明

    1.声明日志格式 声明log    log位置                log格式; access_log logs/access.log main; 2.定义日志格式(以下为常用的日志格式 可 ...

  9. Go的100天之旅-常量

    常量 简介 道可道,非常道.这里常道指的永恒不变的道理,常有不变的意思.顾名思义和变量相比,常量在声明之后就不可改变,它的值是在编译期间就确定的. 下面简单的声明一个常量: const p int = ...

  10. OSCP Learning Notes - File Transfers(2)

    Metasploit Target Server: Kioptrix Level 1 (1) Start the Metasploit on Kali Linux. (2) Set the modul ...