暴力枚举非树边取值做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)的更多相关文章

  1. 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] ...

  2. bzoj 3572世界树 虚树+dp

    题目大意: 给一棵树,每次给出一些关键点,对于树上每个点,被离它最近的关键点(距离相同被标号最小的)控制 求每个关键点控制多少个点 分析: 虚树+dp dp过程如下: 第一次dp,递归求出每个点子树中 ...

  3. bzoj 2286 [Sdoi2011]消耗战 虚树+dp

    题目大意:多次给出关键点,求切断边使所有关键点与1断开的最小费用 分析:每次造出虚树,dp[i]表示将i和i子树与父亲断开费用 对于父亲x,儿子y ①y为关键点:\(dp[x]\)+=\(dismn( ...

  4. 【BZOJ】2286: [Sdoi2011]消耗战 虚树+DP

    [题意]给定n个点的带边权树,每次询问给定ki个特殊点,求隔离点1和特殊点的最小代价.n<=250000,Σki<=500000. [算法]虚树+DP [题解]考虑普通树上的dp,设f[x ...

  5. [BZOJ2286][SDOI2011]消耗战(虚树DP)

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4998  Solved: 1867[Submit][Statu ...

  6. BZOJ 3572 [HNOI2014]世界树 (虚树+DP)

    题面:BZOJ传送门 洛谷传送门 题目大意:略 细节贼多的虚树$DP$ 先考虑只有一次询问的情况 一个节点$x$可能被它子树内的一个到x距离最小的特殊点管辖,还可能被管辖fa[x]的特殊点管辖 跑两次 ...

  7. 洛谷P2495 [SDOI2011]消耗战(虚树dp)

    P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...

  8. BZOJ5287 HNOI2018毒瘤(虚树+树形dp)

    显然的做法是暴力枚举非树边所连接两点的选或不选,大力dp.考场上写的是最暴力的O(3n-mn),成功比大众分少10分.容斥或者注意到某些枚举是不必要的就能让底数变成2.但暴力的极限也就到此为止. 每次 ...

  9. 洛谷 P4426 - [HNOI/AHOI2018]毒瘤(虚树+dp)

    题面传送门 神仙虚树题. 首先考虑最 trival 的情况:\(m=n-1\),也就是一棵树的情况.这个我相信刚学树形 \(dp\) 的都能够秒掉罢(确信).直接设 \(dp_{i,0/1}\) 在表 ...

随机推荐

  1. javaScript书写规范

    命名规范. 常量名    全部大写并单词间用下划线分隔    如:CSS_BTN_CLOSE.TXT_LOADING对象的属性或方法名    小驼峰式(little camel-case)    如: ...

  2. Unity 3(二):Unity在AOP方面的应用

    本文关注以下方面(环境为VS2012..Net Framework 4.5以及Unity 3): AOP简介: Interception using Unity示例 配置文件示例 一.AOP简介 AO ...

  3. web项目启动首页能访问接口报404

    这个问题如果控制台没有报错,然后看一下日志,看看spring容器是否加载: 如果是一直卡在这里了,多半是resources文件下的配置有问题,或者是resources目录不是源文件,工具无法识别 我遇 ...

  4. Windows执行命令与下载文件总结

    1.前言 在渗透或是病毒分析总是会遇到很多千奇百怪的下载文件和执行命令的方法. 2.实现方式 2.1.Powershell win2003.winXP不支持 $client = new-object ...

  5. 回归模型效果评估系列3-R平方

    决定系数(coefficient of determination,R2)是反映模型拟合优度的重要的统计量,为回归平方和与总平方和之比.R2取值在0到1之间,且无单位,其数值大小反映了回归贡献的相对程 ...

  6. thinkphp模型实例化

    方法一 方法二

  7. JAVA复习笔记:内存结构和类加载

    Part1:JVM内存结构 JVM定义了若干个程序执行期间使用的数据区域.这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁.而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出 ...

  8. (三)Rest风格的资源URL

    第一节:Restful风格的资源URL简介 第二节:SpringMVC对Rest风格的支持 第三节:@PathVariable获取Url变量 第四节:SpringMVC对静态资源的处理 http:// ...

  9. Hive与HBase区别 大墨垂杨

    大墨垂杨 http://www.cnblogs.com/quchunhui/p/5340989.html

  10. 安装mysql-python报错解决办法

    报错: 按照网上的办法,安装mysql-connector-c-6.1.10-winx64.msi和MySQL-python-1.2.3.win-amd64-py2.7 .exe都不行,又源码安装My ...