博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 5287: [Hnoi2018]毒瘤
阅读量:4979 次
发布时间:2019-06-12

本文共 2132 字,大约阅读时间需要 7 分钟。

Description

1146405-20180419150557019-1584988615.png

Solution

\(dfs\) 出一棵生成树之后,多出来的边就都是反祖边了

把反祖边两个端点都拿出来,就会得到最多 \(k=2*(m-n+1)\) 个关键点
除了关键点以外的点转移都是一样的,我们可以预处理出来

关键点数量不多,我们 \(2^k\) 枚举状态,然后像树形 \(DP\) 一样转移就行了

转移需要构一棵虚树,对于虚树上的一条边,对应在原树上的一条链转移也是一样的
如果知道了虚树上 \(x\)\(DP\) 值,\(f[x][0],f[x][1]\),那么就可以推出虚树上的父亲的值 \(f[fa[x]][0],f[fa[x]][1]\)
大致可以表示成这样的形式:\(f[fa[x]][0]=k0*f[x][0]+k1*f[x][1]\),\(f[fa[x]][1]\) 同理

对于转移系数和虚树上某些节点的 \(DP\) 初值都可以 \(O(n*k)\) 的预处理出来

对于一条边 \((x,y)\),只有三种状态:存在 \(x\),存在 \(y\),都不存在,所以状态数实际上只有 \(3^{\frac{k}{2}}\)
复杂度是 \(O(n*k+3^{\frac{k}{2}}*k)\)

#include
using namespace std;const int N=1e5+10,mod=998244353;int n,m,head[N],nxt[N*4],to[N*4],num=1,st[N],top=0,sq[N],fa[N][20];int ST[N*2],TOP=0,dfn[N],DFN=0,tp=0,dep[N],q[N],r=0,Head[N],id[N];inline bool comp(int i,int j){return dfn[i]
=0;i--)if(deep>>i&1)x=fa[x][i]; if(x==y)return x; for(int i=19;i>=0;i--) if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i]; return fa[x][0];}bool vis[N],et[N*4];int imp[N],lim,ans=0,f[N][2],lis[N];struct data{ int k0,k1; data(){} data(int _k0,int _k1){k0=_k0;k1=_k1;} inline data operator +(data &t){return data((k0+t.k0)%mod,(k1+t.k1)%mod);} inline data operator *(int t){ return data(1ll*k0*t%mod,1ll*k1*t%mod);} inline int F(int x,int y){return (1ll*x*k0+1ll*y*k1)%mod;}}k[N][2];inline void build(int x,int last){ vis[x]=1;dfn[x]=++DFN; for(int i=head[x];i;i=nxt[i]){ if(i==last)continue; int u=to[i]; if(!vis[u])fa[u][0]=x,dep[u]=dep[x]+1,build(u,i^1); else if(dep[u]
dfn[lca]){ if(dfn[q[r-1]]>dfn[lca])Link(q[r-1],q[r]); else { Link(lca,q[r]);r--; if(q[r]!=lca)q[++r]=lca;break; } r--; } q[++r]=lis[i]; } while(r>1)Link(q[r-1],q[r]),r--; for(int i=1;i<=cnt;i++)d[lis[i]]=1; DFS(1);lim=(1<
>id[st[j]]&1) && (i>>id[sq[j]]&1)){flag=0;break;} if(!flag)continue; for(int j=1;j<=tp;j++)imp[ST[j]]=i>>(j-1)&1; dfs(1); ans=((ans+f[1][0])%mod+f[1][1])%mod; } cout<
<

转载于:https://www.cnblogs.com/Yuzao/p/8883096.html

你可能感兴趣的文章
Feature toggle
查看>>
day02
查看>>
gvim 配置Pydiction
查看>>
Linux安装指定mysql版本
查看>>
分布式锁的三种实现方式
查看>>
poj 2109 pow函数也能这么用?p的开n次方
查看>>
Oracle database link
查看>>
python调用shell小技巧
查看>>
TL431的几种常用用法
查看>>
js 经典闭包题目详解
查看>>
在项目中移除CocoaPods
查看>>
【洛谷】CYJian的水题大赛【第二弹】解题报告
查看>>
POJ 1703 Find them, Catch them【种类/带权并查集+判断两元素是否在同一集合/不同集合/无法确定+类似食物链】...
查看>>
L1-5. A除以B【一种输出格式错了,务必看清楚输入输出】
查看>>
Git一分钟系列--快速安装git客户端
查看>>
纵越6省1市-重新启动
查看>>
hive安装以及hive on spark
查看>>
jz1074 【基础】寻找2的幂
查看>>
Wannafly模拟赛5 A 思维 D 暴力
查看>>
【Linux开发】CCS远程调试ARM,AM4378
查看>>