[BZOJ5287][HNOI2018]毒瘤(虚树DP)
暴力枚举非树边取值做DP可得75。
注意到每次枚举出一个容斥状态的时候,都要做大量重复操作。
建立虚树,预处理出虚树上两点间的转移系数。也可动态DP解决。
树上倍增、动态DP、虚树DP似乎是这种问题的三种通用解法。
代码不是特别长但极其难写,预处理过程中要考虑各种情况。水平不够只好抄代码。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
using namespace std; const int N=,mod=;
bool mark[N],vis[N],ban[N][];
int n,m,u,v,tot,tim,ans,sz[N],du[N],dv[N],dfn[N],dp[N][],g[N][];
struct P{ int k0,k1; }K[N][]; P operator +(const P &a,const P &b){ return (P){(a.k0+b.k0)%mod,(a.k1+b.k1)%mod}; }
P operator *(const P &a,int x){ return (P){int(1ll*a.k0*x%mod),int(1ll*a.k1*x%mod)}; } struct Edge{
int cnt,h[N],to[N<<],nxt[N<<];
P val[][];
void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; }
void add(int u,int v,const P &a,const P &b){
to[++cnt]=v; val[cnt][]=a; val[cnt][]=b; nxt[cnt]=h[u]; h[u]=cnt;
} void dfs1(int x,int fa){
dfn[x]=++tim;
For(i,x) if ((k=to[i])!=fa){
if (!dfn[k]) dfs1(k,x),sz[x]+=sz[k];
else if (dfn[k]<dfn[x]) du[++tot]=x,dv[tot]=k,mark[x]=mark[k]=;
}
mark[x]|=(sz[x]>=); if (mark[x]) sz[x]=;
} void dfs3(int x){
dp[x][]=ban[x][] ? : g[x][];
dp[x][]=ban[x][] ? : g[x][];
For(i,x){
dfs3(k=to[i]);
dp[x][]=1ll*dp[x][]*(1ll*val[i][].k0*dp[k][]%mod+1ll*val[i][].k1*dp[k][]%mod)%mod;
dp[x][]=1ll*dp[x][]*(1ll*val[i][].k0*dp[k][]%mod+1ll*val[i][].k1*dp[k][]%mod)%mod;
}
}
}G1,G2; int dfs2(int x){
g[x][]=g[x][]=; vis[x]=; int t=;
for (int i=G1.h[x],k; i; i=G1.nxt[i]) if (!vis[k=G1.to[i]]){
int z=dfs2(k);
if (!z) g[x][]=1ll*g[x][]*(g[k][]+g[k][])%mod,g[x][]=1ll*g[x][]*g[k][]%mod;
else{
if (mark[x]) G2.add(x,z,K[k][]+K[k][],K[k][]);
else K[x][]=K[k][]+K[k][],K[x][]=K[k][],t=z;
}
}
if (mark[x]) K[x][]=(P){,},K[x][]=(P){,},t=x;
else K[x][]=K[x][]*g[x][],K[x][]=K[x][]*g[x][];
return t;
} int main(){
freopen("bzoj5287.in","r",stdin);
freopen("bzoj5287.out","w",stdout);
scanf("%d%d",&n,&m);
rep(i,,m) scanf("%d%d",&u,&v),G1.add(u,v),G1.add(v,u);
G1.dfs1(,); mark[]=; dfs2();
for (int S=; S<(<<tot); S++){
rep(i,,tot) if (S&(<<(i-))) ban[dv[i]][]=,ban[du[i]][]=; else ban[dv[i]][]=;
G2.dfs3(); ans=(ans+(dp[][]+dp[][])%mod)%mod;
rep(i,,tot) if (S&(<<(i-))) ban[dv[i]][]=,ban[du[i]][]=; else ban[dv[i]][]=;
}
printf("%d\n",ans);
return ;
}
[BZOJ5287][HNOI2018]毒瘤(虚树DP)的更多相关文章
- BZOJ.5287.[AHOI HNOI2018]毒瘤(虚树 树形DP)
BZOJ LOJ 洛谷 设\(f[i][0/1]\)表示到第\(i\)个点,不选/选这个点的方案数.对于一棵树,有:\[f[x][0]=\prod_{v\in son[x]}(f[v][0]+f[v] ...
- bzoj 3572世界树 虚树+dp
题目大意: 给一棵树,每次给出一些关键点,对于树上每个点,被离它最近的关键点(距离相同被标号最小的)控制 求每个关键点控制多少个点 分析: 虚树+dp dp过程如下: 第一次dp,递归求出每个点子树中 ...
- bzoj 2286 [Sdoi2011]消耗战 虚树+dp
题目大意:多次给出关键点,求切断边使所有关键点与1断开的最小费用 分析:每次造出虚树,dp[i]表示将i和i子树与父亲断开费用 对于父亲x,儿子y ①y为关键点:\(dp[x]\)+=\(dismn( ...
- 【BZOJ】2286: [Sdoi2011]消耗战 虚树+DP
[题意]给定n个点的带边权树,每次询问给定ki个特殊点,求隔离点1和特殊点的最小代价.n<=250000,Σki<=500000. [算法]虚树+DP [题解]考虑普通树上的dp,设f[x ...
- [BZOJ2286][SDOI2011]消耗战(虚树DP)
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4998 Solved: 1867[Submit][Statu ...
- BZOJ 3572 [HNOI2014]世界树 (虚树+DP)
题面:BZOJ传送门 洛谷传送门 题目大意:略 细节贼多的虚树$DP$ 先考虑只有一次询问的情况 一个节点$x$可能被它子树内的一个到x距离最小的特殊点管辖,还可能被管辖fa[x]的特殊点管辖 跑两次 ...
- 洛谷P2495 [SDOI2011]消耗战(虚树dp)
P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...
- BZOJ5287 HNOI2018毒瘤(虚树+树形dp)
显然的做法是暴力枚举非树边所连接两点的选或不选,大力dp.考场上写的是最暴力的O(3n-mn),成功比大众分少10分.容斥或者注意到某些枚举是不必要的就能让底数变成2.但暴力的极限也就到此为止. 每次 ...
- 洛谷 P4426 - [HNOI/AHOI2018]毒瘤(虚树+dp)
题面传送门 神仙虚树题. 首先考虑最 trival 的情况:\(m=n-1\),也就是一棵树的情况.这个我相信刚学树形 \(dp\) 的都能够秒掉罢(确信).直接设 \(dp_{i,0/1}\) 在表 ...
随机推荐
- 差分约束系统 + spfa(A - Layout POJ - 3169)
题目链接:https://cn.vjudge.net/contest/276233#problem/A 差分约束系统,假设当前有三个不等式 x- y <=t1 y-z<=t2 x-z< ...
- jQuery 库的优缺点
通用性良好,适合大多数常规网站,省去了为浏览器兼容性写封装函数的麻烦(1+版本支持IE6.7.8,2+版本支持包括IE9在内的现代浏览器). 通用性良好意味着特异性不好,所以jQuery并不适合特异性 ...
- oggMonitor是什么
goldengate monitor是一套监控goldengate的软件,如果安装的ogg比较多,使用goldengate monitor可以清楚的看见全部OGG的每个进程运行状态,以及整个OGG的架 ...
- Java Dom对XML的解析和修改操作
与Dom4J和JDom对XML的操作类似,JDK提供的JavaDom解析器用起来一样方便,在解析XML方面Java DOM甚至更甚前两者一筹!其不足之处在于对XML的增删改比较繁琐,特开篇介绍... ...
- Jenkins远程调度Shell命令
http://blog.csdn.net/fireofjava/article/details/40624353 Jenkins服务器为Win7版本,需要远程调用CentOS服务器上Shell脚本,然 ...
- innobackupex 相关语法讲解【转】
innobackupex 相关语法讲解 连接服务器 The database user used to connect to the server and its password are speci ...
- swagger学习
https://segmentfault.com/a/1190000010144742 https://segmentfault.com/a/1190000014775124 https://blog ...
- TableView 的那些坑
1. 分割线填满cell宽度, 并且设置分割线的颜色 1.1 利用系统的分割线填充 1.1.1 tableView 设置如下属性 // 给tableView设置如下属性值 tableView.layo ...
- Hadoop(二):MapReduce程序(Java)
Java版本程序开发过程主要包含三个步骤,一是map.reduce程序开发:第二是将程序编译成JAR包:第三使用Hadoop jar命令进行任务提交. 下面拿一个具体的例子进行说明,一个简单的词频统计 ...
- Codeforces 981D Bookshelves(按位贪心+二维DP)
题目链接:http://codeforces.com/contest/981/problem/D 题目大意:给你n本书以及每本书的价值,现在让你把n本书放到k个书架上(只有连续的几本书可以放到一个书架 ...