日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

BZOJ3515 : EvenPaths

發布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;
}

  

轉載于:https://www.cnblogs.com/clrs97/p/5768648.html

總結

以上是生活随笔為你收集整理的BZOJ3515 : EvenPaths的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。