QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#716354#2549. King's PalaceMilkcat2009WA 1ms7964kbC++142.1kb2024-11-06 15:00:252024-11-06 15:00:25

Judging History

你现在查看的是最新测评结果

  • [2024-11-06 15:00:25]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:7964kb
  • [2024-11-06 15:00:25]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
int n,m;
int st[22][3][3],oz[1<<22],lg[1<<22];
int co[22],dp[1<<22];char c1,c2;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0,u,v,x,y;i<m;i++){
        scanf("%d%c%d%c",&u,&c1,&v,&c2);
			x = (c1 == 'R' ? 0 : (c1 == 'G' ? 1 : 2));
			y = (c2 == 'R' ? 0 : (c2 == 'G' ? 1 : 2));
        u--,v--;
        st[u][x][y]|=(1<<v);
        st[v][y][x]|=(1<<u);
    }
    lg[0]=-1;
    for(int s=1;s<(1<<n);s++)lg[s]=lg[s>>1]+1,oz[s]=lg[s&-s];
    dp[0]=1;
    for(int s=1;s<(1<<n);s++){
        int x=oz[s];
        for(int t=0;t<2;t++){
            int vis=(1<<x);bool fl=0;
            co[x]=t;queue<int>q;q.push(x);
            while(!q.empty()){
                int u=q.front();q.pop();
                for(int o=0;o<2;o++){
                    for(int j=s&st[u][co[u]][o^1];j;j-=(j&-j)){
                        int v=oz[j];
                        if(!((vis>>v)&1))co[v]=o,q.push(v),vis|=(1<<v);
                        else if(co[v]!=o){fl=1;break;}
                    }
                }
                if(fl)break;
            }
            if(!fl)dp[s]+=dp[s^vis];
        }
    }
    long long ans=0;
    for(int s=0;s<(1<<n);s++){
        bool fl=0;
        int s_=((1<<n)-1)^s,vis=0;
        queue<int>q;
        for(int i=0;i<n;i++)if((s>>i)&1){
            if(st[i][2][2]&s){fl=1;break;}
            for(int o=0;o<2;o++){
                for(int j=s_&st[i][2][o^1];j;j-=(j&-j)){
                    int v=oz[j];
                    if(!((vis>>v)&1))co[v]=o,q.push(v),vis|=(1<<v);
                    else if(co[v]!=o){fl=1;break;}
                }
            }
        }
        if(fl)continue;
        while(!q.empty()){
            int u=q.front();q.pop();
            for(int o=0;o<2;o++){
                for(int j=s_&st[u][co[u]][o^1];j;j-=(j&-j)){
                    int v=oz[j];
                    if(!((vis>>v)&1))co[v]=o,q.push(v),vis|=(1<<v);
                    else if(co[v]!=o){fl=1;break;}
                }
            }
            if(fl)break;
        }
        if(!fl)ans+=dp[s_^vis];
    }
    return printf("%lld",ans),0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 7964kb

input:

2 3
1 R 2 R
1 G 2 R
1 B 2 G

output:

8

result:

wrong answer expected '6', found '8'