[JSOI 2018] 潜入行动
[题目链接]
https://www.lydsy.com/JudgeOnline/problem.php?id=5314
[算法]
考虑dp , 用f[i][j][0 / 1][0 / 1]表示以i为根的子树中选了j个 , 是否选i , i是否被覆盖的方案数
树形背包进行合并 , 转移即可
时间复杂度 : O(NK)
[代码]
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int MAXN = 1e5 + ;
const int MAXK = ;
const int P = 1e9 + ; struct edge
{
int to , nxt;
} e[MAXN << ]; int n , K , tot;
int head[MAXN] , dp[MAXN][MAXK][][] , tmp[MAXK][][] , size[MAXN]; #define rint register int template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline void addedge(int x , int y)
{
++tot;
e[tot] = (edge){y , head[x]};
head[x] = tot;
}
inline void update(int &x , int y)
{
x += y;
while (x >= P) x -= P;
}
inline void dfs(int u , int par)
{
size[u] = ;
dp[u][][][] = ;
dp[u][][][] = ;
for (rint i = head[u]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == par) continue;
dfs(v , u);
for (rint j = min(K , size[u] + size[v]); j >= ; --j)
{
tmp[j][][] = ;
tmp[j][][] = ;
tmp[j][][] = ;
tmp[j][][] = ;
}
for (rint j = ; j <= size[u] && j <= K; ++j)
{
for (rint k = ; k <= size[v] && j + k <= K; ++k)
{
if (dp[u][j][][])
{
update(tmp[j + k][][] , 1LL * dp[u][j][][] * dp[v][k][][] % P);
update(tmp[j + k][][] , 1LL * dp[u][j][][] * dp[v][k][][] % P);
update(tmp[j + k][][] , 1LL * dp[u][j][][] * dp[v][k][][] % P);
update(tmp[j + k][][] , 1LL * dp[u][j][][] * dp[v][k][][] % P);
}
if (dp[u][j][][])
{
update(tmp[j + k][][] , 1LL * dp[u][j][][] * dp[v][k][][] % P);
update(tmp[j + k][][] , 1LL * dp[u][j][][] * dp[v][k][][] % P);
update(tmp[j + k][][] , 1LL * dp[u][j][][] * dp[v][k][][] % P);
update(tmp[j + k][][] , 1LL * dp[u][j][][] * dp[v][k][][] % P);
}
if (dp[u][j][][])
{
update(tmp[j + k][][] , 1LL * dp[u][j][][] * dp[v][k][][] % P);
update(tmp[j + k][][] , 1LL * dp[u][j][][] * dp[v][k][][] % P);
}
if (dp[u][j][][])
{
update(tmp[j + k][][] , 1LL * dp[u][j][][] * dp[v][k][][] % P);
update(tmp[j + k][][] , 1LL * dp[u][j][][] * dp[v][k][][] % P);
}
}
}
size[u] += size[v];
for (int j = min(K , size[u]); j >= ; --j)
{
dp[u][j][][] = tmp[j][][];
dp[u][j][][] = tmp[j][][];
dp[u][j][][] = tmp[j][][];
dp[u][j][][] = tmp[j][][];
}
}
} int main()
{ read(n); read(K);
for (rint i = ; i < n; ++i)
{
int x , y;
read(x); read(y);
addedge(x , y);
addedge(y , x);
}
dfs( , );
printf("%d\n" , (dp[][K][][] + dp[][K][][]) % P); return ; }
[JSOI 2018] 潜入行动的更多相关文章
- [BZOJ5250][九省联考2018]秘密袭击(DP)
5250: [2018多省省队联测]秘密袭击 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 0[Submit][Status][D ...
- JSOI部分题解
JSOI部分题解 JSOI2018 战争 问题转化为给定你两个凸包\(\mathbb S,\mathbb T\),每次独立的询问将\(\mathbb T\)中的每个点移动一个向量,问\(\mathbb ...
- 2018. The Debut Album
http://acm.timus.ru/problem.aspx?space=1&num=2018 真心爱过,怎么能彻底忘掉 题目大意: 长度为n的串,由1和2组成,连续的1不能超过a个,连续 ...
- Math.abs(~2018),掌握规律即可!
Math.abs(~2018) 某前端群的入门问题长姿势了,一个简单的入门问题却引发了我的思考,深深的体会到自己在学习前端技术的同时忽略遗忘了一些计算机的基础知识. 对于 JS Math对象没什么可说 ...
- 潜入ICU的四逆汤
制附子50克(先煎2小时).干姜15克.炙甘草10克.桂枝10克.上好肉桂10克(后下).煎取药液300毫升,分三次鼻饲.这是昨天我给A先生病危的父亲开的处方:四逆汤加肉桂.桂枝. 昨天上午的门诊到2 ...
- 2786: [JSOI]Word Query电子字典
2786: [JSOI]Word Query电子字典 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 3[Submit][Statu ...
- 1819: [JSOI]Word Query电子字典
1819: [JSOI]Word Query电子字典 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 729 Solved: 238[Submit][S ...
- 肖秀荣8套卷2018pdf下载|2018肖秀荣冲刺8套卷pdf下载电子版
肖秀荣8套卷2018pdf下载|2018肖秀荣冲刺8套卷pdf下载电子版 下载链接: https://u253469.ctfile.com/fs/253469-229815828
- 2018年的UX设计师薪酬预测,你能拿多少?
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 一个经验丰富的设计师完全可以根据地区和专业来可以预期薪酬之间的差距,其中悬殊最高可达80K. 本 ...
随机推荐
- Lua学习三----------Lua数据类型
© 版权声明:本文为博主原创文章,转载请注明出处 Lua数据类型 - Lua是动态类型语言,不需要为变量定义类型,只需要为变量赋值 - Lua有8中基本数据类型:nil.boolean.number. ...
- 线性表的链式实现(C++)
相关内容: 线性表的顺序实现 链式实现(C语言) (推荐在GitHub上查看,下面代码只是最初实现,后续如果有修改,由于太麻烦,不会再更改下文,仅仅更新Github上的代码文件) 结点以及链表类的定义 ...
- 小练习:用socket实现Linux和Windows之间的通信
在日常生活中,绝大部分人使用的机器通常是windows系统,可是对于研发人员,开发.编译等工作往往是建立在linux机器上.其实.在服务器方面,Linux.UNIX和WindowsServer占领了市 ...
- JAVA程序开发按位运算的记录
忘记在哪里看到一个面试题:把int a,b的值互换,不能使用临时变量.刚开始完全懵逼,脑子里面全是浆糊,不知道如何下手.查看答案后猛地一惊,心想居然还有这种操作,真是叹为观止,真的感觉自己的基础是如此 ...
- 微信小程序页面布局之弹性布局-Flex介绍
布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. 2009年,W3C 提出了一种新 ...
- rtmp直播拉流客户端EasyRTMPClient设计过程中时间戳问题汇总
EasyRTMPClient 简介 EasyRTMPClient是EasyDarwin流媒体团队开发.提供的一套非常稳定.易用.支持重连接的RTMPClient工具,以SDK形式提供,接口调用非常简单 ...
- poj 2151Check the difficulty of problems<概率DP>
链接:http://poj.org/problem?id=2151 题意:一场比赛有 T 支队伍,共 M 道题, 给出每支队伍能解出各题的概率~ 求 :冠军至少做出 N 题且每队至少做出一题的概率~ ...
- 在pycharm中误删了Python文件,怎么办,挺急的?
1.今天在操作的时候,误删了文件,怎么办? (1)找到删除的上一级文件=>右键,找到Local History=>Show History (2),打开之后,双击左边的恢复时间内容,在右边 ...
- protobuf + maven 爬坑记
疯狂创客圈 死磕Netty 亿级流量架构系列之20 [博客园 总入口 ] 本文说明 本篇是 netty+Protobuf 整合实战的 第一篇,完成一个 基于Netty + Protobuf 实战案例. ...
- 【题解】CF359B Permutation
[题解]CF359B Permutation 求一个长度为\(2n\)的序列,满足\(\Sigma |a_{2i}-a_{2i-1}|-|\Sigma a_{2i}-a_{2i-1}|=2k\) 这种 ...