BZOJ3515 : EvenPaths
首先拓扑排序,并将障碍点按拓扑序平均分成两半。
那么一条$0$到$1$的路径一定是形如:
$0$->前一半点->后一半点->第一个后一半障碍点->后一半点->$1$。
对于两边分别暴力枚举所有情况,设$f[i]$表示$0$出发到达$i$,且到$i$之前不经过任意一个后一半障碍点到达$i$的路径数;$g[i]$表示从$i$出发到$1$的路径数。
那么枚举第一个后一半障碍点(或者是$1$),需要满足$f==1$且$g==1$,于是用FWT加速计算这个与卷积即可。
时间复杂度$O(2^\frac{Y}{2}(N+M))$。
#include<cstdio>
typedef long long ll;
const int N=55,M=505;
int n,cnt,m,ret,i,j,x,S,T;
int is[N],g[N],v[M],nxt[M],ed,d[N],q[N],h,t;
int id[N],vip[N],ban[N],f[N];
ll F[1<<17],G[1<<17],ans;
char a[N];
void add(int x,int y){d[y]++;v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
void FWT(ll*a,int n){
for(int d=1;d<n;d<<=1)for(int m=d<<1,i=0;i<n;i+=m)for(int j=0;j<d;j++){
ll x=a[i+j],y=a[i+j+d];
a[i+j]=x+y;
}
}
void UFWT(ll*a,int n){
for(int d=1;d<n;d<<=1)for(int m=d<<1,i=0;i<n;i+=m)for(int j=0;j<d;j++){
ll x=a[i+j],y=a[i+j+d];
a[i+j]=x-y;
}
}
int main(){
scanf("%d%s",&n,a);
for(i=0;i<n;i++)if(a[i]=='?')is[i]=1;
for(i=0;i<n;i++)for(scanf("%s",a),j=0;j<n;j++)if(a[j]=='Y')add(i,j);
for(t=-1,i=0;i<n;i++)if(!d[i])q[++t]=i;
while(h<=t)for(i=g[x=q[h++]];i;i=nxt[i])if(!(--d[v[i]]))q[++t]=v[i];
for(i=0;i<n;i++)if(is[q[i]])id[m++]=q[i];
cnt=m/2,ret=m-cnt+1;
for(vip[1]=1,i=cnt;i<m;i++)vip[id[i]]=1;
for(S=0;S<1<<cnt;S++){
for(i=0;i<n;i++)ban[i]=f[i]=0;
for(i=0;i<cnt;i++)if(S>>i&1)ban[id[i]]=1;
for(i=0;i<n;i++){
x=q[i];
if(!x)f[x]=1;
if(ban[x])f[x]=0;
if(!f[x])continue;
if(!vip[x])for(j=g[x];j;j=nxt[j])f[v[j]]^=1;
}
for(T=0,i=cnt;i<m;i++)if(f[id[i]])T|=1<<(i-cnt);
if(f[1])T|=1<<(ret-1);
F[T]++;
}
for(S=0;S<1<<(m-cnt);S++){
for(i=0;i<n;i++)ban[i]=f[i]=0;
for(i=0;i<(m-cnt);i++)if(S>>i&1)ban[id[i+cnt]]=1;
for(i=n-1;~i;i--){
x=q[i];
if(x==1){f[x]=1;continue;}
if(ban[x])continue;
for(j=g[x];j;j=nxt[j])f[x]^=f[v[j]];
}
for(T=0,i=cnt;i<m;i++)if(f[id[i]])T|=1<<(i-cnt);
if(f[1])T|=1<<(ret-1);
G[T]++;
}
FWT(F,1<<ret),FWT(G,1<<ret);
for(i=0;i<1<<ret;i++)F[i]*=G[i];
UFWT(F,1<<ret);
for(i=0;i<1<<ret;i++)if(__builtin_popcount(i)&1^1)ans+=F[i];
return printf("%lld",ans),0;
}
BZOJ3515 : EvenPaths的更多相关文章
- 近期概况&总结
下午考完英语的学考就要放假啦,是衡中的假期啊QAQ 所以灰常的激动,一点也不想写题(我不会告诉你其实假期只有一个晚上.. 自从CTSC&APIO回来之后就一直在机房颓颓颓,跟着zcg学了很多新 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- 分享类shareSDK
1.新浪微博分享时需要注意: [A] 应用信息->基本信息->应用地址 [B] 应用信息->高级信息->OAuth2.0 授权设置 //当使用新浪微博客户端分享的时候需要按照下 ...
- Codeforces Round #324 (Div. 2) C (二分)
题目链接:http://codeforces.com/contest/734/problem/C 题意: 玩一个游戏,一开始升一级需要t秒时间,现在有a, b两种魔法,两种魔法分别有m1, m2种效果 ...
- 《Thinking in Java》十四章类型信息_习题解
1~10 Page 318 练习1. 在ToyTest.java中,将Toy的默认构造器注释掉,并解释发生的现象. 书中代码如下(略有改动): package org.cc.foo_008; p ...
- CI重定向:php(codeigniter)中如何重定向
Q: 在保存完数据之后需要重定向,防止数据重复提交. 我使用$this->方法名();跳转,发现不能达到重定向的效果(地址栏没变) 请教高手重定向怎么用 A: $this->load-&g ...
- ODATA WEB API(二)----ODATA服务与客户端
一.概述 ODATA不经可以作为WebAPI建立相应的WEBAPI控制器,还可以建立ODataControl控制器,能够通过插件建立第三方ODataClinet类库:调用和使用数据变得简单可行. 二. ...
- 解决Android解析图片的OOM问题!!!(转)
大家好,今天给大家分享的是解决解析图片的出现oom的问题,我们可以用BitmapFactory这里的各种Decode方法,如果图片很小的话,不会出现oom,但是当图片很大的时候 就要用BitmapFa ...
- loj 1032 数位dp
题目链接:http://lightoj.com/volume_showproblem.php?problem=1032 思路:数位dp, 采用记忆化搜索, dp[pos][pre][have] 表示 ...
- Android开发工具之Dash
作为一名死coder,每天最常见的动作就是查看各种API文档,你一定也有过同时打开N个窗口(HTML.PDF.CHM),不停的在编辑器与文档之间切换的感受吧?怎么说呢,其实我很讨厌这种枯燥无味的动作, ...
- win7,vs2010,asp.net项目中修改外部js文件,在调试时加载的还是旧文件
win7,vs2010,asp.net项目中修改外部js文件,在调试时加载的还是旧文件 我杀过 w3wp.exe和asp.net_state的进程,重启 iis admin的服务,都还是不行. 只是把 ...
- 你必须知道的.NET之特性和属性(转)
1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间走进一个发现attribute登堂入室的入口.因为.NET Framework中使用了大量的定制特性来完成代码约定 ...