「PKUWC2018」随机算法
思博状压写不出是不是没救了呀
首先我们直接状压当前最大独立集的大小显然是不对的,因为我们的答案还和我们考虑的顺序有关
我们发现最大独立集的个数好像不是很多,可能是\(O(n)\)级别的,于是我们考虑从这个方面入手
我们求出所有的最大独立集,考虑求出有多少种考虑顺序能够恰好得到这个最大独立集
设当前已经考虑的点的状态为\(S\)时的方案数为\(dp_S\)
我们考虑枚举出一个不在状态\(S\)的点\(x\)
分两种情况
\(x\)是最大独立集的点,所以我们可以把这个点加入\(S\)
\(x\)不是最大独立集的点,我们发现只有当和这个点相邻的且属于最大独立集的点加入\(S\),我们才能加入\(x\),这样\(x\)才能不被加入独立集
于是我们这样做就好啦,复杂度是\(O(2^nn^2)\),卡卡常数就过去啦
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define lb(x) ((x)&(-x))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int maxn=(1<<20)+5;
const int mod=998244353;
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int st[maxn][21],top[maxn];
int cnt[maxn],f[maxn],vis[22],tot,ans,inv[22];
int n,m,N,d[22],g[maxn],dp[maxn],lg[maxn];
inline int chk(int S) {
int t=S;
while(t) {
int x=lg[lb(t)];
t-=lb(t);
if(d[x]&S) return 0;
}
return 1;
}
inline void get(int S,int p) {
int t=S;
while(t) {
int x=lg[lb(t)];
t-=lb(t);st[p][++top[p]]=x;
}
}
inline int qm(int a) {return a>=mod?a-mod:a;}
inline int calc(int S) {
int t=S;memset(vis,0,sizeof(vis));
while(t) {
int x=lg[lb(t)];
t-=lb(t);vis[x]=1;
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(re int i=0;i<N;i++) {
for(re int j=1;j<=top[i];j++) {
int x=st[i][j];
if(vis[x]||(d[x]&S&i))
dp[i|(1<<(x-1))]=qm(dp[i|(1<<(x-1))]+dp[i]);
}
}
return dp[N];
}
int main() {
n=read(),m=read();N=(1<<n)-1;
for(re int i=1;i<=N;i++) cnt[i]=cnt[i>>1]+(i&1);
for(re int x,y,i=1;i<=m;i++) {
x=read(),y=read();
d[x]|=(1<<(y-1));d[y]|=(1<<(x-1));
}
for(re int i=1;i<=n;i++) lg[1<<(i-1)]=i;
for(re int i=0;i<=N;i++) get(N^i,i);
for(re int i=1;i<=N;i++) f[i]=chk(i);
for(re int i=1;i<=N;i++) if(f[i]&&cnt[i]>cnt[ans]) ans=i;
for(re int i=1;i<=N;i++)
if(f[i]&&cnt[i]==cnt[ans])
tot=qm(tot+calc(i));
inv[1]=1;
for(re int i=2;i<=n;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(re int i=2;i<=n;i++) tot=(1ll*tot*inv[i])%mod;
printf("%d\n",tot);
return 0;
}
至于\(O(2^nn)\)的正解好像很神仙的样子,大概是加入一个点的时候把和它相连的点都加入进来,转移的过程中还要乘上排列数,一看我就不会,于是就不写啦
「PKUWC2018」随机算法的更多相关文章
- 【LOJ2540】「PKUWC2018」随机算法
题意 题面 给一个 \(n\) 个点 \(m\) 条边的无向图.考虑如下求独立集的随机算法:随机一个排列并按顺序加点.如果当前点能加入独立集就加入,否则不加入.求该算法能求出最大独立集的概率. \(n ...
- LOJ2540. 「PKUWC2018」随机算法【概率期望DP+状压DP】
LINK 思路 首先在加入几个点之后所有的点都只有三种状态 一个是在独立集中,一个是和独立集联通,还有一个是没有被访问过 然后前两个状态是可以压缩起来的 因为我们只需要记录下当前独立集大小和是否被访问 ...
- loj2540 「PKUWC2018」随机算法 【状压dp】
题目链接 loj2540 题解 有一个朴素三进制状压\(dp\),考虑当前点三种状态:没考虑过,被选入集合,被排除 就有了\(O(n3^{n})\)的转移 但这样不优,我们考虑优化状态 设\(f[i] ...
- 【LOJ】 #2540. 「PKUWC2018」随机算法
题解 感觉极其神奇的状压dp \(dp[i][S]\)表示答案为i,然后不可选的点集为S 我们每次往答案里加一个点,然后方案数是,设原来可以选的点数是y,新加入一个点后导致了除了新加的点之外x个点不能 ...
- loj#2540. 「PKUWC2018」随机算法
传送门 完了pkuwc咋全是dp怕是要爆零了-- 设\(f(S)\)表示\(S\)的排列数,\(S\)为不能再选的点集(也就是选到独立集里的点和与他们相邻的点),\(mx(S)\)表示\(S\)状态下 ...
- LOJ2540「PKUWC2018」随机算法
又是一道被咕了很久的题 貌似从WC2019之前咕到了现在 我们用f[i][s]表示现在最大独立集的大小为i 不可选集合为s 然后转移O(n)枚举加进来的点就比较简单啦 这个的复杂度是O(2^n*n^2 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- 「PKUWC2018」随机游走(min-max容斥+FWT)
「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...
- LOJ2542. 「PKUWC2018」随机游走
LOJ2542. 「PKUWC2018」随机游走 https://loj.ac/problem/2542 分析: 为了学习最值反演而做的这道题~ \(max{S}=\sum\limits_{T\sub ...
随机推荐
- Java基础教程(12)--深入理解类
一.方法的返回值 当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...
- dubbo基于tcp协议的RPC框架
什么是 RPC 框架 谁能用通俗的语言解释一下什么是 RPC 框架? - 远程过程调用协议RPC(Remote Procedure Call Protocol) 首先了解什么叫RPC,为什么要RPC, ...
- 14、通过jpa往数据库插数据
这是接着上一篇写的,在上一篇的基础上添加 Controller @RestController public class HelloController { @Resource private Hel ...
- Golang beego ORM + CRUP 操作详解
构建beego Web 项目 首先构建一个beego 的web 项目,这个我们完全可以参考beego 官网中的开发文档,上面介绍的非常的详细,在这我就不给大家介绍,主要是介绍ORM ...
- python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)
转载:http://python.jobbole.com/81683/ 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需 ...
- java图形界面之图形化按钮
要将按钮图形化,只需创建一个ImageIcon对象,将图形路径赋予ImageIcon对象,然后将该对象传递给按钮即可. 此处涉及eclipse中图形的路径设置,包括(项目路径下.非项目路径下.相对路径 ...
- BZOJ1856: [Scoi2010]字符串(组合数)
题意 题目链接 Sol \(30 \%\)dp: \(f[i][j]\)表示放了\(i\)个\(1\)和\(j\)个\(0\)的不合法方案 f[0][0] = 1; cin >> N &g ...
- JS基础(四)之jQuery
31.jQuery(http://jquery.com/)是一个快速.简洁的JavaScript框架. 它封装了JavaScript常用的功能代码,提供一种便捷的JavaScript设计模式,优化HT ...
- 使用WebDAV实现Office文档在线编辑
Office的文档处理能力是非常强大的,但是它是本地资源,在Office Web App尚未成熟前,仍需要使用本地能力来进行文档编辑,可是现代的系统的主流却是B/S,所以在B/S中调用本地的Offic ...
- 地图的可视化--Folium
1.安装folium pip install MarkupSafe-0.23-cp34-none-win_amd64.whl pip install Jinja2-2.8-py2.py3-none-a ...