博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「PKUWC 2018」随机算法 (60分部分分做法)
阅读量:5371 次
发布时间:2019-06-15

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

 

    明天就是CTSC的DAY 2了qwq,晚上敲敲暴力攒攒RP,果断随便看了个题就是打暴力hhhhh

    前50% O(3^N) 暴力没什么好说的,我们设F[S][s]为已经选了S集合中的点,并且这个集合中的点的最大独立集是s的方案数,最后统计完了乘上 n! 的逆元就好了。  (s肯定是S的一个子集,所以复杂度是 3^n)

    然鹅中间的暴力分只会链。。。。。

 

    首先如果n是奇数的话,那么最大独立集只可能是所有奇数点,所有这种情况下我们知道了选了的点的集合就知道独立集是什么了,所以可以直接 O(2^n) dp了。。。。

    但是出题人并没有这么良心2333,这一个点的n在最后的数据里是偶数。。。。

 

    考虑如果n是偶数的情况的话,独立集只可能是:全是奇数的点 或者 全是偶数的点 或者 ∑ [i是偶数] <=i的全是奇数的点 和 >i的全是偶数的点,这样的话我们先用 与求n是奇数的同样的方法 (钦定最大独立集是所有奇数点) 求出对于每个偶数i,最大独立集是<=i的奇数的点的答案,然后卷积合并一下就好啦,因为后面的全是偶数的点的集合可以看成是反向的全是奇数的点的集合。 

    合并的时候还要乘上一个组合数,因为两边元素之间的顺序还没有确定、

 

#include
#define ll long longusing namespace std;const int maxn=300005,ha=998244353;inline int add(int &x,int y){ x+=y; if(x>=ha) x-=ha;}inline int ksm(int x,int y){ int an=1; for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha; return an;}unordered_map
f[maxn];unordered_map
:: iterator it;int n,ci[35],m,uu,vv,BC[maxn],ans,M;bool G[35][35],can[maxn][23];inline int ADD(int S,int x){ return can[S][x]?(S|ci[x]):S;}int g[maxn*4+5],jc[233],C[233][233];inline void init(){ for(int i=0;i
first,j),M=max(M,BC[to]); add(f[S][to],it->second); } for(it=f[all].begin();it!=f[all].end();++it) if(BC[it->first]==M) add(ans,it->second);}inline int get_line(int N){ memset(g,0,sizeof(g)); g[0]=1; int all=ci[N]-1; for(int i=0;i

  

转载于:https://www.cnblogs.com/JYYHH/p/9011613.html

你可能感兴趣的文章
【VS开发】ATL辅助COM组件开发
查看>>
FlatBuffers In Android
查看>>
《演说之禅》I &amp; II 读书笔记
查看>>
thinkphp3.2接入支付宝支付接口(PC端)
查看>>
【转】在Eclipse中安装和使用TFS插件
查看>>
C#中Monitor和Lock以及区别
查看>>
【NOIP2017】奶酪
查看>>
5.6.3.7 localeCompare() 方法
查看>>
Linux下好用的简单实用命令
查看>>
描绘应用程序级的信息
查看>>
php环境搭建脚本
查看>>
php 编译常见错误
查看>>
MES架构
查看>>
hdu 2767(tarjan)
查看>>
sklearn之分类模型混淆矩阵和分类报告
查看>>
MySQL各存储引擎
查看>>
项目--简单导出CSV文件
查看>>
Oracle session相关数据字典(一)
查看>>
BZOJ 3399 [Usaco2009 Mar]Sand Castle城堡(贪心)
查看>>
WCF(一) 简单的认知
查看>>