QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#946574#6683. Difficult Constructive ProblemyanchengzhiAC ✓11ms5124kbC++202.9kb2025-03-21 23:14:452025-03-21 23:14:46

Judging History

This is the latest submission verdict.

  • [2025-03-21 23:14:46]
  • Judged
  • Verdict: AC
  • Time: 11ms
  • Memory: 5124kb
  • [2025-03-21 23:14:45]
  • Submitted

answer

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

void solve() {
    int n, k;
    string a;
    cin >> n >> k;
    cin >> a;
    a = " " + a;
    vector<int> R2(n + 1), R1(n + 1), L(n + 1), nxt(n + 2);
    for(int i = n, lst = -1; i >= 1; i--) {
        if(a[i] != '?') {
            nxt[i] = i;
            if(lst != -1) {
                R1[i] = R1[lst];
                R2[i] = R2[lst];
                L[i] = L[lst];
                if(a[i] == a[lst]) {
                    R2[i] += lst - i - 1 + (lst - i - 1) % 2;
                }
                else {
                    R2[i] += lst - i - 1 + ((lst - i - 1) % 2 == 0) - 1;
                    L[i] += 1;
                }
            }
            else {
                R1[i] = n - i;
                R2[i] = 0;
                L[i] = 0;
            }
            lst = i;
        }
        else {
            nxt[i] = nxt[i + 1];
        }
    }
    // cout << L[9] << ' ' << R[9] << '\n';
    string ans = a;
    int sum = 0;
    for(int i = 1; i <= n; i++) {
        if(a[i] != '?') {
            sum += (i > 1 && ans[i] != ans[i - 1]);
        }
        else {
            // try 0
            int nsum = sum + (i > 1 && '0' != ans[i - 1]);
            int l = 0, r1 = 0, r2 = 0;
            if(!nxt[i + 1]) {
                r1 += n - i;
            }
            else {
                l += L[nxt[i + 1]];
                r1 += R1[nxt[i + 1]];
                r2 += R2[nxt[i + 1]];
                if('0' == a[nxt[i + 1]]) {
                    r2 += nxt[i + 1] - i - 1 + (nxt[i + 1] - i - 1) % 2;
                }
                else {
                    l += 1;
                    r2 += nxt[i + 1] - i - 1 + ((nxt[i + 1] - i - 1) % 2 == 0) - 1;
                }
            }
            // cout << i << ' ' << sum << ' ' << nsum << ' ' << l << ' ' << r << '\n';
            nsum += l;
            ans[i] = '1';
            if(nsum <= k) {
                if(k % 2 != nsum % 2) {
                    if(r1 > 0) {
                        r1--;
                        nsum++;
                        if(nsum + r1 + r2 >= k) {
                            ans[i] = '0';
                        }
                    }
                }
                else {
                    if(nsum + r1 + r2 >= k) {
                        ans[i] = '0';
                    }
                }
            }
            sum += (i > 1 && ans[i] != ans[i - 1]);
        }
    }
    // cout << ans << '\n';
    if(sum != k) {
        cout << "Impossible\n";
    }
    else {
        cout << ans.substr(1, n) << '\n';
    }
}
int main() {
#ifdef yczDEBUG
    freopen("1.in", "r", stdin);
    freopen("1.out", "w", stdout);
#endif
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T;
    cin >> T;
    while(T--) {
        solve();
    }
    return 0;
}

这程序好像有点Bug,我给组数据试试?

詳細信息

Test #1:

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

input:

5
9 6
1?010??01
9 5
1?010??01
9 6
100101101
9 5
100101101
9 3
????????1

output:

100100101
Impossible
100101101
Impossible
000000101

result:

ok 5 lines

Test #2:

score: 0
Accepted
time: 11ms
memory: 5124kb

input:

6110
2 0
01
9 5
????110??
18 8
???111???00??010??
11 8
001??01???0
2 0
00
8 1
?????111
11 2
110???01???
13 7
??100???01??1
6 2
?????0
18 8
110??11??011??110?
12 5
00??011??00?
20 10
??01???0011???0010??
1 0
?
13 6
???10??110??0
6 2
00???1
17 10
??010??001???11??
5 2
????0
14 7
010???00???11?
2 1
01
...

output:

Impossible
001011001
000111000000101010
00101010010
00
00000111
11000001111
0010000101001
000010
110001100011001101
000001101001
00010000011001001010
0
0001000110010
Impossible
00010010010101100
00010
01000100010111
01
0100100001
Impossible
001100010100100101
00111111000
000
01111001
001000000100010...

result:

ok 6110 lines