luogu P4516 [JSOI2018]潜入行动
LINK:潜入行动
初看题感觉很不可做 但是树形dp的状态过于明显。
容易设\(f_{x,j,l,r}\)表示x为根子树内放了j个设备且子树内都被覆盖l表示x是否被覆盖r表示x是否放设备的方案数。
初值我是上面四个状态都设为1 转移分类讨论一下也不困难。
然后需要容斥一下。
复杂度看起来是\(n\cdot k^2\)的 其实是\(n\cdot k\)的 证明 这个我就不口胡了。
当然还有一种转移是只给正确的状态转移 这样就不需要容斥了 可能常数会小一点。
我常数比较大 开o2才能过 枚举的边界注意把握好 这是TLE和AC的区别。
code
//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 10000000000000000ll
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define vep(p,n,i) for(RE int i=p;i<n;++i)
#define pii pair<int,int>
#define mk make_pair
#define RE register
#define P 1000000007
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-4
#define sq sqrt
#define S second
#define F first
#define mod 1000000007
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;RE char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
return x*f;
}
const int MAXN=100002,maxn=102;
int n,len,lim,cc,ww;
int f[MAXN][maxn][2][2],sz[MAXN],g[maxn][2][2];
int lin[MAXN],nex[MAXN<<1],ver[MAXN<<1];
inline int mul(int x,int y){return (ll)x*y%mod;}
inline int add2(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline void add(int &x,int y){x=x+y>=mod?x+y-mod:x+y;}
inline int mus(int x,int y){return x-y<0?x-y+mod:x-y;}
inline void add1(int x,int y)
{
ver[++len]=y;nex[len]=lin[x];lin[x]=len;
ver[++len]=x;nex[len]=lin[y];lin[y]=len;
}
inline void dfs(int x,int fa)
{
f[x][0][0][0]=f[x][1][0][1]=1;sz[x]=1;
f[x][1][1][1]=f[x][0][1][0]=1;
go(x)if(tn!=fa)
{
dfs(tn,x);
rep(0,min(sz[x],lim),j)rep(0,1,l)rep(0,1,r)g[j][l][r]=f[x][j][l][r],f[x][j][l][r]=0;
cc=min(sz[x],lim);
rep(0,cc,j)
{
rep(0,sz[tn],k)
{
if(j+k<=lim)
{
add(f[x][j+k][0][0],mul(f[tn][k][1][0],g[j][0][0]));
add(f[x][j+k][0][1],mul(add2(f[tn][k][0][0],f[tn][k][1][0]),g[j][0][1]));
add(f[x][j+k][1][0],mul(add2(f[tn][k][1][1],f[tn][k][1][0]),g[j][1][0]));
add(f[x][j+k][1][1],mul(add2(f[tn][k][1][0],f[tn][k][1][1]),g[j][1][1]));
add(f[x][j+k][1][1],mul(add2(f[tn][k][0][1],f[tn][k][0][0]),g[j][1][1]));
}
else break;
}
}
sz[x]+=sz[tn];
}
cc=min(sz[x],lim);
rep(0,cc,j)f[x][j][1][0]=mus(f[x][j][1][0],f[x][j][0][0]),f[x][j][1][1]=mus(f[x][j][1][1],f[x][j][0][1]);
}
int main()
{
//freopen("1.in","r",stdin);
get(n);get(lim);
rep(2,n,i)add1(read(),read());
dfs(1,0);put(add2(f[1][lim][1][0],f[1][lim][1][1]));
return 0;
}
luogu P4516 [JSOI2018]潜入行动的更多相关文章
- 洛谷 P4516 [JSOI2018]潜入行动
题面传送门 一眼树形 \(dp\) 本题有 \(2\) 大难点. 难点之一是状态的设计,这里需要四维状态,\(dp[i][j][0/1][0/1]\) 表示在以 \(i\) 为根的子树内放了 \(j\ ...
- 【BZOJ5314】[JSOI2018]潜入行动(动态规划)
[BZOJ5314][JSOI2018]潜入行动(动态规划) 题面 BZOJ 洛谷 题解 不难想到一个沙雕\(dp\),设\(f[i][j][0/1][0/1]\)表示当前点\(i\),子树中一共放了 ...
- BZOJ5314: [Jsoi2018]潜入行动
BZOJ5314: [Jsoi2018]潜入行动 https://lydsy.com/JudgeOnline/problem.php?id=5314 分析: 裸树形背包,设\(f[x][i][0/1] ...
- BZOJ5314:[JSOI2018]潜入行动——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5314 https://www.luogu.org/problemnew/show/P4516 ht ...
- [bzoj5314][Jsoi2018]潜入行动_树形背包dp
潜入行动 bzoj-5314 Jsoi-2018 题目大意:题目链接. 注释:略. 想法: 学长给我们除了一套考试题,三个学长一人一道这是T1. 好吧好吧,傻逼背包...... 复杂度$O(nk)$. ...
- bzoj 5314: [Jsoi2018]潜入行动
Description 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY已经联系好了黄金舰队,打算联合所有JSO Ier抵御外星人的进攻.在黄金舰队就位之前,JYY打算事先了解外星人 ...
- [loj2546][JSOI2018]潜入行动(树形DP)
题目描述 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY 已经联系好了黄金舰队,打算联合所有 JSOIer 抵御外星人的进攻. 在黄金舰队就位之前,JYY 打算事先了解外星人的进攻 ...
- [JSOI2018]潜入行动
题目 我好菜啊,嘤嘤嘤 原来本地访问数组负下标不会报\(RE\)或者\(WA\),甚至能跑出正解啊 这道题还是非常呆的 我们发现\(k\)很小,于是断定这是一个树上背包 发现在一个点上安装控制器并不能 ...
- BZOJ5314 [Jsoi2018]潜入行动 【背包类树形dp】
题目链接 BZOJ5314 题解 设\(f[i][j][0|1][0|1]\)表示\(i\)为根的子树,用了\(j\)个监测器,\(i\)节点是否被控制,\(i\)节点是否放置的方案数 然后转移即可 ...
随机推荐
- django模板中变更数据库信息后,如何把变更后的信息同步更新到数据库
我们在基于django开发项目的过程中,经常会遇到数据库表字段增加,删除,或者修改的情况,以及字段属性更改的情况,因为django基于ORM模式来操作数据库的, 传统上如果django项目中的数据库m ...
- python入门007
一.深浅copy 浅拷贝:是把原列表第一层的内存地址完全拷贝一份给新列表.即只能保证对原列表中第一层地址(不可变类型)的改操作不受影响,涉及到原列表中第二层地址(可变类型)的改操作时,原列表变,新列表 ...
- mui点击蒙版点击蒙版让其不自动关闭
var mask = mui.createMask(callback);//callback为用户点击蒙版时自动执行的回调: mask.show();//显示遮罩 mask.close();//关闭遮 ...
- redis(十八):Redis 配置
#redis.conf# Redis configuration file example.# ./redis-server /path/to/redis.conf ################# ...
- Azure Web App (三)切换你的Net Core Web 项目的数据库连接字符串
一,引言 上一篇文章讲到今天我们演示了一下,如何在Web App中创建 “Deployment Slot”进行快速无停机部署新功能代码,也使用VS进行发布到创建的Web App中创建的新的部署槽位中, ...
- webpack源码-打包资源输出到本地
webpack收集完依赖是怎么打包资源的呢? 入口compiler.js: this.applyPluginsParallel("make", compilation, err = ...
- git分支间切换注意点和bug分支的处理
目录 备注: 知识点 记一次分支合并问题状况 从分支点开始,不同分支修改工作区的内容(不添加到暂存区和提交),切换分支,工作区的内容是一样的. 必须在提交或者暂存当前暂存区的状态后,再切换或合并分支 ...
- 简单实用的办公软件导航网站,IT经理必备工具
最近非常忙,因为公司上线了业财一体化系统.今天分享一个非常实用的办公软件导航网站,节省了我很多百度的时间. 快氪导航,让软件服务更简单. 一.办公软件导航 站长已经按照功能进行了分类:协同办公,流程审 ...
- 【Python学习笔记六】获取百度搜索结果以及百度返回“百度安全验证”问题解决
1.获取百度搜索结果页面主要是修改百度搜索url中的参数实现,例如查询的关键字为wd: 举例:https://www.baidu.com/s?wd=python",这样就可以查询到‘pyth ...
- 二进制图片blob数据转canvas
javascript是有操作二进制文件的方法的,在这里就不详述了. 而AJAX的核心XMLHttpRequest也可以获取服务端给的二进制Blob. 可以参考: XMLHttpRequest Leve ...