[bzoj3444] 最后的晚餐

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj3444] 最后的晚餐相关的知识,希望对你有一定的参考价值。

  显然只有当暗恋关系是链的时候才能塞进座位里。

  一人连着>2人的话就无解,小心重边。

  一条链本身有两种方案,假设总共有n个联通块,其中m条链,答案就是n!*2^m

  一开始因为重边炸了几发

技术分享
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7 const int maxn=500233,modd=989381;
 8 int fa[maxn],deg[maxn],sz[maxn],to[maxn],cnt;
 9 int i,j,k,n,m;
10 bool gg;
11  
12 int ra;char rx;
13 inline int read(){
14     rx=getchar(),ra=0;
15     while(rx<0||rx>9)rx=getchar();
16     while(rx>=0&&rx<=9)ra*=10,ra+=rx-48,rx=getchar();return ra;
17 }
18 inline int getfa(int x){return fa[x]!=x?fa[x]=getfa(fa[x]):x;}
19 inline void merge(int a,int b){
20     if(to[b]!=a)deg[a]++,deg[b]++;
21     if(deg[a]>2||deg[b]>2)gg=1;
22     int x=a,y=b;
23     a=getfa(a),b=getfa(b);
24     if(a!=b)
25         fa[b]=a,sz[a]+=sz[b];
26     else if(sz[a]>2&&to[y]!=x)gg=1;
27 }
28 int main(){
29     n=read(),m=read();
30     for(i=1;i<=n;i++)fa[i]=i,sz[i]=1;
31     for(i=1;i<=m&&!gg;i++)
32         j=read(),to[j]=read(),merge(j,to[j]);
33     if(gg){puts("0");return 0;}
34     ll ans=1;
35     for(i=1;i<=n;i++)if(fa[i]==i){
36         if(sz[i]>1)ans<<=1,ans-=ans>=modd?modd:0;
37         cnt++,ans=ans*cnt%modd;
38     }
39     printf("%lld\\n",ans);
40 }
View Code

 

以上是关于[bzoj3444] 最后的晚餐的主要内容,如果未能解决你的问题,请参考以下文章

Luogu3444ORK-Ploughing(贪心)

P3444 [POI2006]ORK-Ploughing

Bzoj2339--Hnoi2011卡农

[bzoj1966][Ahoi2005][VIRUS 病毒检测] (字符串dp)

BZOJ初级水题列表——献给那些想要进军BZOJ的OIers(自用,怕荒废了最后的六月考试月,刷刷水题,水水更健康)

异常和TCP通讯