\(\mathcal{Description}\)

  Link.

  给定一棵含 \(n\) 个点的树,每个结点有两个权值 \(a\) 和 \(b\)。对于 \(k\in[1,m]\),分别求

\[\left|\arg\max_{\sum_{u\in S} a_u=k}\sum_{u\in S}b_u\right|
\]

  其中 \(S\) 是树上的一个独立点集。

  测试数据组数 \(\le20\),\(n\le50\),\(m\le5\times10^3\)。

\(\mathcal{Solution}\)

  一个 naive 的 DP 方法是,令 \(f(u,i,0/1)\) 表示 \(u\) 子树内,入 \(S\) 的点 \(a\) 值之和为 \(i\),且 \(u\) 入/未入集时最大的 \(b\) 值之和及其方案数。这种做法慢在需要 \(\mathcal O(m^2)\) 合并两棵子树的 DP 信息。我们尝试转化成一种仅需要单点更新的 DP。

  考虑点分树,因为结点 \(u\) 在原树上的邻接点必然是点分树上 \(u\) 的祖先或子树内的孩子,所以可以在点分树上以 DFN 的顺序 DP,令状态 \(f(i,s,j)\) 表示考虑了 DFN 在 \([1,i]\) 之间的结点,设 \(u\) 是 DFN 为 \(i\) 的结点,那么 \(s\) 为 \(u\) 的祖先中被选结点的深度集合,\(j\) 为 \(a\) 值之和,状态表示最大值及方案数。

  以上,每次暴力插入一个结点更新 DP 数组,就能做到 \(\mathcal O(Tnm2^{\log n})=\mathcal O(Tn^2m)\) 了。

  (我写 T 了,也许是代码问题,抱歉 qwq。

\(\mathcal{Code}\)

  会 T 掉的可怜代码。

/* Clearink */

#include <cstdio>

#define rep( i, l, r ) for ( int i = l, repEnd##i = r; i <= repEnd##i; ++i )
#define per( i, r, l ) for ( int i = r, repEnd##i = l; i >= repEnd##i; --i ) typedef long long LL; inline void chkmax( int& a, const int b ) { a < b && ( a = b, 0 ); } const int MAXN = 100, MAXM = 5e3;
int n, m, a[MAXN + 5], b[MAXN + 5];
int siz[MAXN + 5], wgt[MAXN + 5], ban[MAXN + 5], dep[MAXN + 5];
bool vis[MAXN + 5]; struct Graph {
int ecnt, head[MAXN + 5], to[MAXN * 2 + 5], nxt[MAXN * 2 + 5]; inline void operator () ( const int u, const int v ) {
to[++ecnt] = v, nxt[ecnt] = head[u], head[u] = ecnt;
} inline void clear( const int n ) {
ecnt = 0;
rep ( i, 1, n ) head[i] = 0;
}
} srcT, divT; #define adj( T, u, v ) \
for ( int i = T.head[u], v; v = T.to[i], i; i = T.nxt[i] ) struct Atom {
int val; LL cnt;
Atom(): val( 0 ), cnt( 0 ) {}
Atom( const int v, const LL c ): val( v ), cnt( c ) {} inline Atom operator + ( const int x ) {
return cnt ? Atom( val + x, cnt ) : Atom();
} inline Atom& operator += ( const Atom& u ) {
if ( val == u.val ) cnt += u.cnt;
if ( val < u.val ) *this = u;
return *this;
}
} f[MAXN * 4 + 5][MAXM + 5]; inline void findG( const int u, const int fa, const int all, int& rt ) {
siz[u] = 1, wgt[u] = 0;
adj ( srcT, u, v ) if ( !vis[v] && v != fa ) {
findG( v, u, all, rt ), siz[u] += siz[v];
chkmax( wgt[u], siz[v] );
}
chkmax( wgt[u], all - siz[u] );
if ( !rt || wgt[u] < wgt[rt] ) rt = u;
} inline void build( const int u ) {
vis[u] = true;
adj ( srcT, u, v ) if ( !vis[v] ) {
int rt = 0; findG( v, 0, siz[v], rt );
divT( u, rt ), dep[rt] = dep[u] + 1;
build( rt );
}
} inline void solve( const int u, int& lasd ) {
int d = dep[u];
rep ( i, 1 << d, ( 1 << lasd << 1 ) - 1 ) {
Atom *cf = f[i & ( ( 1 << d ) - 1 )], *lf = f[i];
rep ( j, 0, m ) cf[j] += lf[j], lf[j] = Atom();
}
rep ( i, 0, ( 1 << d ) - 1 ) {
if ( i & ban[u] ) continue;
Atom *cf = f[i | 1 << d], *lf = f[i];
rep ( j, 0, m - a[u] ) cf[j + a[u]] += lf[j] + b[u];
}
lasd = d;
adj ( divT, u, v ) solve( v, lasd );
} int main() {
int T; scanf( "%d", &T );
rep ( cas, 1, T ) {
scanf( "%d %d", &n, &m );
srcT.clear( n ), divT.clear( n );
rep ( i, 1, n ) vis[i] = false;
// f[][] is cleared when outputing;
// ban[] is cleared when calculating.
rep ( i, 1, n ) scanf( "%d %d", &a[i], &b[i] );
for ( int i = 2, u, v; i <= n; ++i ) {
scanf( "%d %d", &u, &v );
srcT( u, v ), srcT( v, u );
}
int rt = 0; findG( 1, 0, n, rt );
build( rt );
rep ( u, 1, n ) {
ban[u] = 0;
adj ( srcT, u, v ) ban[u] |= ( dep[v] < dep[u] ) << dep[v];
}
f[0][0].cnt = 1;
int lasd = 0; solve( rt, lasd );
printf( "Case %d:\n", cas );
rep ( i, 1, m ) {
Atom ans;
rep ( j, 0, ( 1 << lasd << 1 ) - 1 ) {
ans += f[j][i], f[j][i] = Atom();
}
printf( "%lld%c", ans.cnt, i ^ m ? ' ' : '\n' );
}
}
return 0;
}

Solution -「HDU #6566」The Hanged Man的更多相关文章

  1. Solution -「HDU 6875」Yajilin

    \(\mathcal{Description}\)   Link.(HDU 裂开了先放个私链 awa.)   在一个 \(n\times n\) 的方格图中,格子 \((i,j)\) 有权值 \(w_ ...

  2. Solution -「HDU 5498」Tree

    \(\mathcal{Description}\)   link.   给定一个 \(n\) 个结点 \(m\) 条边的无向图,\(q\) 次操作每次随机选出一条边.问 \(q\) 条边去重后构成生成 ...

  3. Solution -「HDU 6643」Ridiculous Netizens

    \(\mathcal{Description}\)   Link.   给定一棵含有 \(n\) 个结点的树,点 \(u\) 有点权 \(w_u\),求树上非空连通块的数量,使得连通块内点权积 \(\ ...

  4. Solution -「HDU 1788」CRT again

    \(\mathcal{Description}\)   Link.   解同余方程组: \[x\equiv m_i-a\pmod{m_i} \]   其中 \(i=1,2,\dots,n\).   \ ...

  5. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  6. Solution -「HDU」Professor Ben

    Description 有 \(Q\) 个询问.每次给定一个正整数 \(n\),求它的所有因数的质因数个数的和. Solution 就讲中间的一个 Trick. 我们定义正整数 \(x\) 有 \(f ...

  7. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  8. Solution -「BZOJ 3812」主旋律

    \(\mathcal{Description}\)   Link.   给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...

  9. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

随机推荐

  1. react组件性能优化PureComponent

    首先我们使用react组件会配合connect来连接store获取state,那么只要store中的state发生改变组件就会重新渲染,所以性能不高,一般我们可以使用shouldComponentUp ...

  2. SQL高级优化系列

    目录 SQL高级优化系列(一)之MySQL优化 SQL高级优化系列(二)之MySQL架构 SQL高级优化系列(三)之存储引擎 SQL高级优化系列(四)之SQL优化 SQL高级优化系列(五)之执行计划 ...

  3. Java实现二叉搜索树的插入、删除

    前置知识 二叉树的结构 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() { } TreeNode( ...

  4. linux下git安装使用新手教程。

    1.进入官网,创建Github帐户,获取git服务. 2.本地安装git客户端,yum install git. 3.生成ssh key,使用命令 "ssh-keygen -t rsa -C ...

  5. 1.IO流

    1.组成部分 File.FileInputStream.FileOutStream.FileWriter.FileReader 2.File pathSeparatorChar ; separator ...

  6. setuid setgid stick bit 特殊权限 粘滞位

    1.setuid与setgid讲解 看一下系统中用到它的地方,以/etc/passwd和/usr/bin/passwd为例: 分析一下,/etc/passwd的权限为 -rw-r--r-- 也就是说: ...

  7. 业务驱动的全景监控体系在阿里的应用 | 阿里巴巴DevOps实践指南

    编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...

  8. 近期Android学习II

    一晃眼又过了5天,这几天的学习有些杂乱,半年在家没运动,返校了准备慢慢恢复运动,身体才是革命的本钱~ 四天跑了三回步,每次都死亡喘息= = 这几天的学习重点总归还是放在Android上了,前面31天连 ...

  9. th 表达式的简单使用。

    一.使用场景,页面中,循环遍历,获得控制器穿过来的值. 1.1 控制器 /** * 获得所有的图书信息 * @return */ @RequestMapping("/turnIndexPag ...

  10. 【建议收藏】Redis超详细入门教程大杂烩

    写在前边 Redis入门的整合篇.本篇也算是把2021年redis留下来的坑填上去,重新整合了一翻,点击这里,回顾我的2020与2021~一名大二后台练习生 NoSQL NoSQL(NoSQL = N ...