题目传送门

题目大意

给出一个 \(n\) 个点 \(m\) 条边的无向图,问有多少个点集满足点集中任意两点均不存在边相连。

\(n\le 10^5,m-n\le 10\),答案对 \(998244353\) 取模。

思路

妙啊!!!

首先我们从树的形态开始考虑,你发现答案其实就是独立集的个数,具体来说我们可以设 \(f_{u,0/1}\) 表示 \(u\) 点选或不选的方案数,可以得到:

\[f_{u,0}=\prod_{v\in son_u} (f_{v,0}+f_{v,1})
\]
\[f_{u,1}=\prod_{v\in son_u} f_{v,0}
\]

然后我们考虑有返祖边的情况,你发现这个边数特别少,于是我们考虑枚举每一条边的情况,你发现只有 \(3\) 种,即 \((0,0),(0,1),(1,0)\),但是实际上可以压缩到 \(2\) 种情况,即考虑一个点是 \(0\) 还是 \(1\)。于是我们可以枚举一下情况,然后时间复杂度就是 \(\Theta(2^{11} n)\)。就可以获得 \(75\) 的好成绩了。为了方便,我们之后称需要枚举情况的点为“不定点”。

然后你发现实际上每次 dp,我们重复计算的东西实际上很多,但是我们经过思考发现其实每次只会改变“不定点”的虚树上的点。于是,我们只需要考虑虚树上儿子对父亲产生的贡献即可。

然后我们发现实际上虚树上的儿子对父亲实际上可以表示为 \(k_{v,0/1,0}f_{v,0}+k_{v,0/1,1}f_{v,1}\),于是我们可以预处理出 \(k_{v,0/1,0/1}\) 这个系数,至于不在虚树上的儿子产生的贡献可以预处理出来。这个式子里面的常数是实际上就是不会改变的点对“不定点”产生的贡献造成的。

然后你就发现这个东西其实跟动态 dp 的思想是差不对的,所以这道题实际上也可以用动态 dp 搞过去。

时间复杂度 \(\Theta(n+s2^s)\),其中 \(s=m-n+1\)。

\(\texttt{Code}\)

#include <bits/stdc++.h>
using namespace std; #define Int register int
#define mod 998244353
#define MAXN 100005 template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> void read (T &x,Args& ... args){read (x),read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');} int n,m;
int mul (int a,int b){return 1ll * a * b % mod;}
int dec (int a,int b){return a >= b ? a - b : a + mod - b;}
int add (int a,int b){return a + b >= mod ? a + b - mod : a + b;} struct Coe{
int a,b;
Coe operator * (const int &p)const{return Coe {mul (a,p),mul (b,p)};}
Coe operator + (const Coe &p)const{return Coe {add (a,p.a),add (b,p.b)};}
}k[MAXN][2]; struct node{
int v;
Coe x,y;
}; vector <int> G[MAXN];
vector <node> E[MAXN]; void Add_Edge (int u,int v){
G[u].push_back (v),
G[v].push_back (u);
}
void Add_Edge1 (int u,int v,Coe w1,Coe w2){
E[u].push_back (node {v,w1,w2});
} int ind,cnt,eu[MAXN],ev[MAXN],siz[MAXN],dfn[MAXN],mark[MAXN]; void dfs (int u,int fa){
dfn[u] = ++ ind;
for (Int v : G[u]){
if (!dfn[v]) dfs (v,u),siz[u] += siz[v];
else if (v != fa){
mark[u] = 1;
if (dfn[u] < dfn[v]) eu[++ cnt] = u,ev[cnt] = v;
}
}
mark[u] |= siz[u] >= 2,siz[u] = siz[u] || mark[u];
} int f[MAXN][2],p[MAXN][2],sur[MAXN][2],vis[MAXN]; int dfs1 (int u){
p[u][0] = p[u][1] = vis[u] = 1;int pos = 0;
for (Int v : G[u]){
if (vis[v]) continue;
int w = dfs1 (v);
if (!w){
p[u][1] = mul (p[u][1],p[v][0]);
p[u][0] = mul (p[u][0],add (p[v][0],p[v][1]));
}
else if (mark[u]) Add_Edge1 (u,w,k[v][0] + k[v][1],k[v][0]);
else k[u][0] = k[v][0] + k[v][1],k[u][1] = k[v][0],pos = w;
}
if (mark[u]) k[u][0] = Coe {1,0},k[u][1] = Coe {0,1},pos = u;
else k[u][0] = k[u][0] * p[u][0],k[u][1] = k[u][1] * p[u][1];
return pos;
} void dfs2 (int u){
f[u][0] = sur[u][1] ? 0 : p[u][0],f[u][1] = sur[u][0] ? 0 : p[u][1];
for (node to : E[u]){
dfs2 (to.v);int v = to.v,p = f[v][0],q = f[v][1];
f[u][0] = mul (f[u][0],add (mul (to.x.a,p),mul (to.x.b,q)));
f[u][1] = mul (f[u][1],add (mul (to.y.a,p),mul (to.y.b,q)));
}
} signed main(){
read (n,m);
for (Int i = 1,u,v;i <= m;++ i) read (u,v),Add_Edge (u,v);
dfs (1,0),mark[1] = 1,dfs1 (1);int up = 1 << cnt,ans = 0;
for (Int S = 0;S < up;++ S){
for (Int i = 1;i <= cnt;++ i)
if (S >> i - 1 & 1) sur[eu[i]][1] = sur[ev[i]][0] = 1;
else sur[eu[i]][0] = 1;
dfs2 (1),ans = add (ans,add (f[1][0],f[1][1]));
for (Int i = 1;i <= cnt;++ i)
if (S >> i - 1 & 1) sur[eu[i]][1] = sur[ev[i]][0] = 0;
else sur[eu[i]][0] = 0;
}
write (ans),putchar ('\n');
return 0;
}

题解 [HNOI/AHOI2018]毒瘤的更多相关文章

  1. [HNOI/AHOI2018]毒瘤

    题目描述 https://www.lydsy.com/JudgeOnline/upload/201804/%E6%B9%96%E5%8D%97%E4%B8%80%E8%AF%95%E8%AF%95%E ...

  2. #10 //I [HNOI/AHOI2018]毒瘤

    题解: 80分做法还是听简单的 对于非树边枚举一下端点状态 然而我也不知道为什么就多t了一个点 具体实现上 最暴力的是3^n次 但是我们可以发现对于i不取,j取 i不取,j不取是可以等效成i不取,j没 ...

  3. P4426 [HNOI/AHOI2018]毒瘤

    挺不错的一个题. 题意即为求一个图的独立集方案数. 如果原图是一棵树,可以直接大力f[x][0/1]来dp. 由于非树边很少,考虑2^11容斥,强制某些点必选,然后再O(n)dp,这样应该过不了. 发 ...

  4. Luogu P4426 [HNOI/AHOI2018]毒瘤

    题目 神仙题. 首先我们可以把题意转化为图的独立集计数.显然这个东西是个NP-Hard的. 然后我们可以注意到\(m\le n+10\),也就是说最多有\(11\)条非树边. 我们现在先考虑一下,树上 ...

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

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

  6. 【题解】Luogu P4436 [HNOI/AHOI2018]游戏

    原题传送门 \(n^2\)过百万在HNOI/AHOI2018中真的成功了qwqwq 先将没门分格的地方连起来,枚举每一个块,看向左向右最多能走多远,最坏复杂度\(O(n^2)\),但出题人竟然没卡(建 ...

  7. 【LG4437】[HNOI/AHOI2018]排列

    [LG4437][HNOI/AHOI2018]排列 题面 洛谷 题解 题面里这个毒瘤的东西我们转化一下: 对于\(\forall k,j\),若\(p_k=a_{p_j}\),则\(k<j\). ...

  8. [HNOI/AHOI2018]转盘(线段树优化单调)

    gugu  bz lei了lei了,事独流体毒瘤题 一句话题意:任选一个点开始,每个时刻向前走一步或者站着不动 问实现每一个点都在$T_i$之后被访问到的最短时间 Step 1 该题可证: 最优方案必 ...

  9. [Bzoj5285][洛谷P4424][HNOI/AHOI2018]寻宝游戏(bitset)

    P4424 [HNOI/AHOI2018]寻宝游戏 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生 ...

随机推荐

  1. Vue.JS快速上手(指令和实例方法)

    1.声明式渲染 首先,我们要知道Vue是声明式渲染,那啥是声明式渲染,我们只需要告诉程序我们想要什么结果,其他的交给程序来做.与声明式渲染相对的是命令式渲染,即命令我们的程序去做什么,程序就会跟着你的 ...

  2. 虚拟dom?diff算法?key?Vue原理的核心三问?打包教你搞定。

    为什么需要虚拟DOM 先介绍浏览器加载一个HTML文件需要做哪些事,帮助我们理解为什么我们需要虚拟DOM.webkit引擎的处理流程,如下图所示: 所有浏览器的引擎工作流程都差不多,如上图大致分5步: ...

  3. 对抗生成网络GAN

      该方法常用于: 图像生成 图像修复,训练用了MSE+Global+Local数据,其中Global+Local判别式用于全局+局部一致性. 图像超分辨率重构   GAN的基本原理,主要包含两个网络 ...

  4. LeetCode通关:连刷三十九道二叉树,刷疯了!

    分门别类刷算法,坚持,进步! 刷题路线参考:https://github.com/youngyangyang04/leetcode-master 大家好,我是拿输出博客来督促自己刷题的老三,这一节我们 ...

  5. maven下载出错

    求解

  6. zap高性能日志

    摘要 日志在整个工程实践中的重要性不言而喻,在选择日志组件的时候也有多方面的考量.详细.正确和及时的反馈是必不可少的,但是整个性能表现是否也是必要考虑的点呢?在长期的实践中发现有的日志组件对于计算资源 ...

  7. vue 接入 vod-js-sdk-v6.js 完成视频上传

    东西有点多,耐心看完.按照操作一步一步来,绝对能成功 首先:npm 引入 npm install vod-js-sdk-v6 mian.js  全局引入  //腾讯云点播 import TcVod f ...

  8. Hounter

      这题是概率与期望,不是很熟,所以冲了两篇题解才来写总结.   首先可以发现1猎人死的轮数是他之前死了的列人数加一.   那么题目转化为求先于一号猎人死的猎人数的期望值.   考虑这样一个事情,就是 ...

  9. Defence

      emm...这道题我调了一下午你敢信??   好吧还是我太天真了.   开始的时候以为自己线段树动态开点与合并写错了,就调;   结果发现没问题,那就是信息维护错了.   一开始以为自己最左右的1 ...

  10. Mysql常用sql语句(5)- as 设置别名

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 需要注意,创建数据库和创建表的语句博文都在前面哦 整个 ...