QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#469707#5070. Check Pattern is BadBalintRWA 28ms3944kbC++204.1kb2024-07-09 22:08:482024-07-09 22:08:48

Judging History

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

  • [2024-07-09 22:08:48]
  • 评测
  • 测评结果:WA
  • 用时:28ms
  • 内存:3944kb
  • [2024-07-09 22:08:48]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

typedef unsigned uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<pii> vpii;
typedef complex<double> cpx;
template <typename T> using minPq = priority_queue<T, vector<T>, greater<T>>;
#define ms(a, x) memset(a, x, sizeof(a))
#define pb push_back
#define fs first
#define sn second
#define ALL(v) begin(v), end(v)
#define SZ(v) ((int) (v).size())
#define lbv(v, x) (lower_bound(ALL(v), x) - (v).begin())
#define ubv(v, x) (upper_bound(ALL(v), x) - (v).begin())
template <typename T> inline void UNIQUE(vector<T> &v){sort(ALL(v)); v.resize(unique(ALL(v)) - v.begin());}
const int INF = 0x3f3f3f3f;
const ll LLINF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1);
#define FR(i, n) for(int i = 0; i < (n); i++)
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define FORR(i, a, b) for(int i = (a); i >= (b); i--)
#define dbg(x) {cerr << #x << ' ' << x << endl;}
#define dbgArr(arr, n) {cerr << #arr; FR(_i, n) cerr << ' ' << (arr)[_i]; cerr << endl;}
template <typename T, typename U>
ostream& operator<<(ostream &os, pair<T, U> p){return os << "(" << p.fs << ", " << p.sn << ")";}

const int MN = 105;
int n, m;
string grid[MN];
int prv[MN][MN], nxt[MN][MN];
bool difA[MN][MN], difB[MN][MN], (*difArr)[MN];
bool resA[MN][MN], resB[MN][MN], (*resArr)[MN];

int stInd[MN][MN];
vector<set<int>> sts;

bool dfs(int x1, int y1){
    if(x1 < 0 || x1 >= n || stInd[x1][y1] == -1) return true;
    set<int> &st = sts[stInd[x1][y1]];
    if(st.find(y1) == st.end()) return true;
    st.erase(y1);
    if(st.empty()) return false;
    if(SZ(st) >= 2) return true;
    int y2 = *st.begin();
    resArr[x1][y2] = true;
    return dfs(x1-1, y2) && dfs(x1+1, y2);
}

bool solveHalf(){
    ms(stInd, -1);
    FR(i, n){
        FR(j, m-1) if(difArr[i][j]){
            if(j && stInd[i][j-1] != -1) stInd[i][j] = stInd[i][j-1];
            else stInd[i][j] = SZ(sts), sts.pb({});
            sts[stInd[i][j]].insert(j);
        }
    }

    FR(i, n) FR(j, m-1) if(stInd[i][j] != -1){
        set<int> &st = sts[stInd[i][j]];
        if(st.find(j) != st.end() && SZ(st) == 1){
            st.clear();
            resArr[i][j] = true;
            if(!dfs(i-1, j) || !dfs(i+1, j)) return false;
        }
    }

    FR(i, n) FR(j, m-1) if(!dfs(i, j)) return false;

    return true;
}

bool solve(){
    cin >> n >> m;
    FR(i, n) cin >> grid[i];
    FR(i, n) if(i & 1) FR(j, m) if(grid[i][j] != '?') grid[i][j] ^= 'W'^'B';
    FR(i, n){
        char ch = '?';
        FR(j, m){
            if(grid[i][j] != '?') ch = grid[i][j];
            prv[i][j] = ch;
        }
        ch = '?';
        FORR(j, m-1, 0){
            if(grid[i][j] != '?') ch = grid[i][j];
            nxt[i][j] = ch;
        }
        FR(j, m){
            if(prv[i][j] == '?' && nxt[i][j] == '?') grid[i][j] = 'W';
            else if(prv[i][j] == nxt[i][j]) grid[i][j] = prv[i][j];
            else if((prv[i][j]^nxt[i][j]) != ('B'^'W')) grid[i][j] = prv[i][j]^nxt[i][j]^'?';
        }
        FR(j, m-1){
            if(prv[i][j] == 'W' && nxt[i][j+1] == 'B') difA[i][j] = true;
            if(prv[i][j] == 'B' && nxt[i][j+1] == 'W') difB[i][j] = true;
        }
        //dbg(grid[i]);
    }

    difArr = difA;
    resArr = resA;
    if(!solveHalf()) return false;
    sts.clear();
    difArr = difB;
    resArr = resB;
    if(!solveHalf()) return false;
    sts.clear();

    FR(i, n){
        assert(grid[i][0] != '?');
        FR(j, m-1) grid[i][j+1] = grid[i][j] ^ (resA[i][j] || resB[i][j])*('W'^'B');
    }

    FR(i, n) if(i & 1) FR(j, m) grid[i][j] ^= 'W'^'B';

    return true;
}

int main(){
    cin.sync_with_stdio(0); cin.tie(0);
    int t; cin >> t;
    while(t--){
        bool res = solve();
        if(res){
            cout << "YES\n";
            FR(i, n) cout << grid[i] << '\n';
        }
        else cout << "NO\n";

        ms(difA, 0);
        ms(difB, 0);
        ms(resA, 0);
        ms(resB, 0);
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3712kb

input:

3
2 2
??
??
3 3
BW?
W?B
?BW
3 3
BW?
W?W
?W?

output:

YES
WW
BB
NO
YES
BWW
WWW
WWW

result:

ok ok (3 test cases)

Test #2:

score: -100
Wrong Answer
time: 28ms
memory: 3944kb

input:

10000
9 2
BB
BW
WW
WW
?W
?B
B?
W?
BB
6 2
??
?B
B?
BW
WW
??
10 7
WBBBW??
???BWWW
???BWWB
??WWBW?
BBWBBWB
WWB?WW?
BWBW???
WWWWBBW
BBWBB?W
B?W?W?B
4 7
??WBWWB
?BBWWWB
?W?BBB?
BBBWBBB
10 1
B
W
?
B
B
W
W
W
B
?
10 4
??WW
W?W?
WWW?
???W
?W??
?W?W
W?W?
?W?W
???W
???W
8 3
WBW
W??
???
???
W?W
W?W
???
?W?
4 1
...

output:

YES
BB
BW
WW
WW
WW
BB
BB
WW
BB
YES
WW
BB
BB
BW
WW
BB
NO
NO
YES
B
W
W
B
B
W
W
W
B
B
YES
WWWW
WWWW
WWWW
WWWW
WWWW
WWWW
WWWW
WWWW
WWWW
WWWW
YES
WBW
WWW
WWW
BBB
WWW
WWW
WWW
WWW
YES
W
B
W
B
NO
YES
BBBBBB
WWWWWB
YES
WWWWW
YES
BWWWWW
WWBBBB
BBBWWW
WWWWWW
YES
W
NO
YES
BBBBBBB
BBBBBBB
BBBBBBB
BBBBBBB
BBBBBBB...

result:

wrong answer ans finds the answer, but out doesn't (test case 9)