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 ...
随机推荐
- java 学习笔记——网络(Socket)
阅读方法:将网页放大到200%. 如果你用过用过word应该知道按住ctrl键使用鼠标滚轮缩放.
- 自定义log日志
Log.cs (这个已经不能用了,用下面的问题解决方案) using System; using System.Collections.Generic; using System.Web; u ...
- MVC - 11(下)jquery.tmpl.js +ajax分页
继续 mvc-11(上).dto:http://www.cnblogs.com/tangge/p/3840060.html jquery.tmpl.js 下载:http://pan.baidu.com ...
- PHP定时器实现每隔几秒运行一次
php是服务器端脚本了并不像js那样有专业的settimeout函数来定时执行了,但只要浏览器不关闭各阶层是可以做到了,下面一起来看看. 下面写个简单例子来讲解这个方法. <?php ignor ...
- Android性能优化系列 + Android官方培训课程中文版
Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/ Android性能优化典范 - 第5季 htt ...
- 【JAVA多线程安全问题解析】
一.问题的提出 以买票系统为例: class Ticket implements Runnable { public int sum=10; public void run() { while(tru ...
- 【sicily】卡片游戏
卡片游戏 Time Limit: 1sec Memory Limit:32MB Description 桌上有一叠牌,从第一张牌(即位于顶面的牌)开始从上往下依次编号为1~n.当至少还剩两张牌 ...
- [译] Extending jQuery Part1 Simple extensions
本章包含: JQuery 的起源和目标. 你能扩展JQuery 的那些部分. JQuery 扩展的实例. 如今,JQuery 已经是网络上最受欢迎的JavaScript Library. 1.1 jQ ...
- wp8 入门到精通 仿QQPivot 提示数量
<Grid x:Name="LayoutRoot" Background="White"> <Grid Width="480&quo ...
- hdu 4063 福州赛区网络赛 圆 ****
画几个图后,知道路径点集一定是起点终点加上圆与圆之间的交点,枚举每两个点之间是否能走,能走则连上线,然后求一遍最短路即可 #include<cstdio> #include<cstd ...