QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#608714#7900. Gifts from KnowledgeDoubeecatWA 0ms7748kbC++202.9kb2024-10-04 01:30:402024-10-04 01:30:40

Judging History

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

  • [2024-10-04 01:30:40]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:7748kb
  • [2024-10-04 01:30:40]
  • 提交

answer

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cassert>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <vector>
#include <cmath>
#include <queue>
using namespace std;
#define ll long long
#define pii pair <int,int>
#define endl '\n'
#define mp make_pair
const int N = 2e6 + 10;
const ll mod=1e9+7;
vector <vector<int> > a;
vector <bool> vis;
vector <int> col;
vector <vector<pii > > G;
int r,c;
char s[N];
int ck[N];
int p[N];
int find(int x){
    if(x!=p[x]){
        p[x]=find(p[x]);
    }
    return p[x];
}
ll qsm(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1)res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
bool dfs(int x) {
    cout << x << " " << col[x] << endl;
    vis[x] = 1;
    bool flag = 1;
    for (auto [y,w] : G[x]) {
        if (!vis[y]) {
            if (w == 1) col[y] = col[x];
            else col[y] = 3 - col[x];
            dfs(y);
        } else {
            int now = 0;
            if (w == 1) {
                now = col[y] == col[x];
            } else {
                now = col[y] == (3 - col[x]);
            }
            if (!now) flag = 0;
        }
    }
    return flag;
}
void solve() {
    cin >> r >> c;
    a.clear();G.clear();vis.clear();col.clear();
    for(int i=1;i<=2*r;i++){
        ck[i]=0;
        p[i]=i;
    }
    a.resize(r+1);
    vis.resize(r+1);
    G.resize(r+1);
    col.resize(r+1);
    for (int i = 1;i <= r;++i) {
        cin >> s;
        a[i].resize(c+1);
        for (int j = 0;j < c;++j) {
            a[i][j+1] = s[j] - '0';
        }
    }
    for(int i=1;i<=c;i++){
        int cnt=0;
        for(int j=1;j<=r;j++){
            if(a[j][i]==1)cnt++;
            if(a[j][c-i+1]==1)cnt++;
        }
        if(cnt>2){
            cout<<0<<endl;
            return;
        }
    }
    for(int i=1;i<=c;i++){
        if(a[1][i]==1){
            ck[i]=1;
        }
    }
    for(int i=2;i<=r;i++){
        for(int j=1;j<=c;j++){

            int x=j,y=c-j+1;
            int pd1=ck[y];

            if(a[i][j]&&ck[y]){
                //i和ck[y]只能同时选,颜色一样
                G[i].push_back(mp(pd1,1));
                G[pd1].push_back(mp(i,1));
                //printf("1:%d %d\n",i,pd1);

            }else if(a[i][j]&&ck[j]){
                G[i].push_back(mp(ck[j],2));
                G[ck[j]].push_back(mp(i,2));
                //printf("2:%d %d\n",i,ck[j]);
            }
            if (a[i][j]) ck[j] = i;
        }
    }
    int cnt=0;
    for(int i=1;i<=r;i++){
        if (!vis[i]) {
            col[i] = 1;
            bool flag = dfs(i);
            if (flag) ++cnt;
        }
    }
    cout<<qsm(2,cnt)<<endl;
}
signed main() {
   // ios::sync_with_stdio(false);
    int T;cin >> T;
    while (T--) solve(); 
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 7748kb

input:

3
3 5
01100
10001
00010
2 1
1
1
2 3
001
001

output:

1 1
3 1
2 1
4
0
1 1
2 2
2

result:

wrong answer 1st numbers differ - expected: '4', found: '1'