[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. 本 ...
随机推荐
- Android网络编程Socket【实例解析】
Socket 事实上和JavaWeb 里面的Socket一模一样 建立客服端,server端,server开一个port供客服端訪问 第一步创建server端:(这里把为了便于解说.把server端, ...
- Android之Intent和Activity
Intent能够说是Android的灵魂,程序跳转和传递数据的时候基本上就是靠Intent了.Intent在Android应用中是相当重要的,理解Intent相应用编程非常有帮助.在Android的官 ...
- A008-drawable资源
关于drawable资源笔者之前有写过两篇文章: Android-自己定义图像资源的使用(1) Android-自己定义图像资源的使用(2) 这里笔者就不做过多的赘述.我们从实际开发的角度去理解这个知 ...
- java变参
java变参是通过数组来实现的 Object[] addAll(Object[] array1, Object... array2)和Object[] addAll(Object[] array1, ...
- Android应用开发:网络工具——Volley(一)
引言 网络一直是我个人的盲点,前一阵子抽空学习了一下Volley网络工具的用法,也透过源代码进行了进一步的学习,有一些心得想分享出来.在Android开发中,成熟的网络工具不少,Android自带了H ...
- spark之pycharm开发设置
方法一: __author__ = 'similarface' import os import sys os.environ['SPARK_HOME']="/Users/similarfa ...
- 局部描述符表LDT的作用+定义+初始化+跳转相关
[0]写在前面 0.1)本代码的作用: 旨在说明局部描述符表的作用,及其相关定义,初始化和跳转等内容: 0.2)文末的个人总结是干货,前面代码仅供参考的,且source code from orang ...
- Unity3D自定义编辑器简单实例
MenuItem:在标题栏自定义菜单.需要在Editor文件夹内创建脚本,无需挂载.但是注意其下的函数必须为静态函数. using UnityEngine; using UnityEditor; pu ...
- bootstrap中模态框的大小设置;
bootstrap模态框调节大小: 大尺寸:黑体加大的字体,是更改的代码 <!-- 大模态框的调节 --> <button type="button" class ...
- 高复用率的RTSPClient组件EasyRTSPClient调用说明
EasyRTSPClient 调用说明 概述 EasyRtspClient是EasyDarwin家族中针对RTSP协议的拉流组件 EasyRtspClient视频支持H264.H265.MJPEG格式 ...