「WC2018」州区划分(FWT)

我去弄了一个升级版的博客主题,比以前好看多了。感谢 @Wider

不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了。

洛谷上不开 \(O_2\) 根本过不去,自带大常数被卡到 \(15\) 分。。。

首先题了读了很久,发现一个州的集合可以不连通。。。

我们可以 \(O(n^22^n)\) 检验每一个状态是否满足条件,用并查集即可。

\(f[S]\) 为状态 \(S\) 时的满意度之和,\(g[S]\) 当状态 \(S\) 为合法状态时为 \(sum_S^p\)

\[f_S=\frac {1}{sum_S^p}\sum_{T\subset S}f_Tg_{S-T}
\]

然后这个东西可以用 \(or\) 卷积的 \(FWT\) 优化。我觉得出题人特地把数据范围出这么大应该是卡 \(O(3^n)\) 的枚举子集。

\(Code\ Below:\)

// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
const int mod=998244353;
int n,m,p,lim,w[30],d[30],e[30],fa[30],bin[30],cnt[1<<21],sum[1<<21],inv[1<<21],f[22][1<<21],g[22][1<<21]; inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline int sub(int x,int y){return x-y<0?x-y+mod:x-y;}
inline int mul(int x,int y){return 1ll*x*y-1ll*x*y/mod*mod;} inline int fpow(int a,int b){
int ret=1;
for(;b;b>>=1,a=mul(a,a))
if(b&1) ret=mul(ret,a);
return ret;
} inline void FWT(int *f,int n){
for(int len=1;len<n;len<<=1)
for(int i=0;i<n;i++)
if(i&len) f[i]=add(f[i],f[i^len]);
} inline void IFWT(int *f,int n){
for(int len=1;len<n;len<<=1)
for(int i=0;i<n;i++)
if(i&len) f[i]=sub(f[i],f[i^len]);
} inline int find(int x){
return (x==fa[x])?x:fa[x]=find(fa[x]);
} inline bool check(int S){
if(cnt[S]<=1) return 0;
int tot=0;
for(int i=0;i<n;i++) fa[i]=i,d[i]=0;
for(int i=0;i<n;i++)
if(S&bin[i]){
sum[S]+=w[i];
for(int j=i+1;j<n;j++)
if((S&bin[j])&&(e[i]&bin[j])){
d[i]++;d[j]++;
if(find(i)!=find(j)) fa[fa[i]]=fa[j],tot++;
}
}
sum[S]=(p==0)?1:(p==1)?sum[S]:sum[S]*sum[S];
if(tot<cnt[S]-1) return 1;
for(int i=0;i<n;i++)
if((S&bin[i])&&(d[i]&1)) return 1;
return 0;
} int main()
{
scanf("%d%d%d",&n,&m,&p);
lim=1<<n;bin[0]=1;
for(int i=1;i<=n;i++) bin[i]=bin[i-1]<<1;
for(int i=1;i<lim;i++) cnt[i]=cnt[i>>1]+(i&1);
int x,y;
for(int i=0;i<m;i++){
scanf("%d%d",&x,&y);
x--;y--;
e[x]|=bin[y];e[y]|=bin[x];
}
for(int i=0;i<n;i++) scanf("%d",&w[i]);
for(int i=0;i<lim;i++){
g[cnt[i]][i]=check(i)?sum[i]:0;
inv[i]=fpow(sum[i],mod-2);
}
for(int i=0;i<=n;i++) FWT(g[i],lim);
f[0][0]=1;FWT(f[0],lim);
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++)
for(int k=0;k<lim;k++) f[i][k]=add(f[i][k],mul(f[j][k],g[i-j][k]));
IFWT(f[i],lim);
for(int k=0;k<lim;k++) f[i][k]=(cnt[k]==i)?mul(f[i][k],inv[k]):0;
if(i<n) FWT(f[i],lim);
}
printf("%d\n",f[n][lim-1]);
return 0;
}

「WC2018」州区划分(FWT)的更多相关文章

  1. 【LOJ】#2340. 「WC2018」州区划分

    题解 学习一个全世界人都会只有我不会的东西 子集变换! 难道我要把这题当板子讲?等等这题好像是板...WC出板题好刺激啊= = 假装我们都做过HAOI2015的FMT题,我们都知道一些FMT怎么解决或 ...

  2. loj#2340. 「WC2018」州区划分

    FWT&&FMT板子 #include<cstdio> #include<iostream> #include<cstring> #include& ...

  3. 【WC2018】州区划分(FWT,动态规划)

    [WC2018]州区划分(FWT,动态规划) 题面 UOJ 洛谷 题解 首先有一个暴力做法(就有\(50\)分了) 先\(O(2^nn^2)\)预处理出每个子集是否合法,然后设\(f[S]\)表示当前 ...

  4. UOJ348. 【WC2018】州区划分

    UOJ348. [WC2018]州区划分 http://uoj.ac/problem/348 分析: 设\(g(S)=(\sum\limits_{x\in S}w_x)^p[合法]\) \(f(S)\ ...

  5. 「WC2018」即时战略

    「WC2018」即时战略 考虑对于一条链:直接随便找点,然后不断问即可. 对于一个二叉树,树高logn,直接随便找点,然后不断问即可. 正解: 先随便找到一个点,问出到1的路径 然后找别的点,考虑问出 ...

  6. loj2341「WC2018」即时战略(随机化,LCT/动态点分治)

    loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...

  7. [WC2018]州区划分——FWT+DP+FST

    题目链接: [WC2018]州区划分 题目大意:给n个点的一个无向图,点有点权,要求将这n个点划分成若干个部分,每部分合法当且仅当这部分中所有点之间的边不能构成欧拉回路.对于一种划分方案,第i个部分的 ...

  8. UOJ#348. 【WC2018】州区划分

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ348.html 前言 第一次知道子集卷积可以自己卷自己. 题解 这是一道子集卷积模板题. 设 $sum[S]$ 表示点集 ...

  9. [WC2018]州区划分(FWT)

    题目描述 题解 这道题的思路感觉很妙. 题目中有一个很奇怪的不合法条件,貌似和后面做题没有什么关系,所以我们先得搞掉它. 也就是判断一个点集是否合法,也就是判断这个点集是否存在欧拉回路. 如果存在欧拉 ...

随机推荐

  1. JRebel 代理激活

    1.生成GUID   https://www.guidgen.com/ 例:04cfff79-8f45-481c-a858-a5b9590422e7 2.License Server 例: http: ...

  2. java 集合是否有序

    参考:https://www.cnblogs.com/hoobey/p/5914226.html

  3. ReactiveX 学习笔记(22)使用 RxJS + Angular 进行 GUI 编程

    课题 程序界面由3个文本编辑框和1个文本标签组成. 要求文本标签实时显示3个文本编辑框所输入的数字之和. 文本编辑框输入的不是合法数字时,将其值视为0. 3个文本编辑框的初值分别为1,2,3. 创建工 ...

  4. Vue框架H5商城类项目商品详情点击返回弹出推荐商品弹窗的实现方案

    需求场景: 非推荐商品详情页返回的时候弹出弹窗推荐商品,点击弹窗按钮可以直接访问推荐商品: 只有直接进入商品详情页返回才会弹出推荐商品弹窗: 每个用户访问只能弹一次(除非清除缓存). 需求分析: 1. ...

  5. [leetcode]49. Group Anagrams变位词归类

    Given an array of strings, group anagrams together. Example: Input: ["eat", "tea" ...

  6. 英雄联盟lol登录错误:登录服务器未响应、您可能遇到了一个网络问题、请检查您的网络。

    第一方法cmd 用管理员命令打开,输入  netsh winsock reset.重启 第二种方法  win+r 输入 regedit  在 HKEY_CURRENT_USER\Software\Mi ...

  7. Solr定时导入功能实现

    需要实现Solr定时导入功能的话,我们可以通过使用Solr自身所集成的dataimportscheduler调度器实现 下载对应的jar包,下载地址https://code.google.com/ar ...

  8. [费用流][NOI2008]志愿者招募

    志愿者招募 题目描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完 ...

  9. [杂谈]杂谈章2 eclipse没有(添加)“Dynamic Web Project”

    原因:你安装的是专门开发java项目的,而Dynamic Web Project  属于J2EE技术 第一种方法: 你要专门下载一个集成了J2EE插件的Eclipse,到eclipse官网下载相对应版 ...

  10. 第四次spring会议

    昨天:对TXT的字体颜色和背景进行了代码编写. 出现的问题:在网上找到如何编写代码后,自己打进去了,输出不出来.少打了一个空格在EventArgs e之间. 今天将做之事: 我设置上换肤和透明度等功能 ...