QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#726129#6683. Difficult Constructive ProblemcrazymoonAC ✓13ms4208kbC++204.4kb2024-11-08 21:47:352024-11-08 21:47:36

Judging History

This is the latest submission verdict.

  • [2024-11-08 21:47:36]
  • Judged
  • Verdict: AC
  • Time: 13ms
  • Memory: 4208kb
  • [2024-11-08 21:47:35]
  • Submitted

answer

#include <bits/stdc++.h>
#define int long long
using namespace std;
const double eps = 1e-8;

void solve() {
    int n, k;
    cin >> n >> k;
    string s;  cin >> s;
    vector<array<int, 3>> tmp;
    vector<string> res;
    for (int i = 1; i < n - 1; ++i) {
        if(s[i] != '?')  continue;
        int ti = i;
        while(ti + 1 < n - 1 && s[ti + 1] == s[i])  ++ti;
        tmp.push_back({i - 1, ti + 1, ti - i + 1});
        i = ti;
    }

    auto check = [&](char x, char y) -> void {
        string t = s;
        t[0] = x;  t[n - 1] = y;
        int minx = 0, maxx = 0;
        for (int i = 0; i < n - 1; ++i) {
            if(t[i] != '?' && t[i + 1] != '?' && t[i] != t[i + 1])  ++minx, ++maxx;
        }
        for (auto [u, v, w] : tmp) {
            if(t[u] != t[v])  minx += 1, maxx += 1 + w / 2 * 2;
            else  maxx += (w + 1) / 2 * 2;
        }
        if(k < minx || k > maxx || (k - minx) % 2)  return ;
        int cur = minx;
        for (auto [u, v, w] : tmp) {
            int mx, t1 = 0;
            if(t[u] != t[v])  mx = 1 + w / 2 * 2;
            else  mx = (w + 1) / 2 * 2;
            if(t[u] != t[v])  mx--, cur--;
            else if(t[u] == '1')  t1 = 2, mx -= 2;
            if(maxx - mx >= k && cur + t1 <= k) {
                for (int i = u + 1; i < v; ++i)  t[i] = '0';
                if(t[u] != t[v])  cur++;
                else if(t[u] == '1')  cur += 2;
                maxx -= mx;
                continue;
            }
            if(maxx == k) {
                if(t[u] != t[v]) {
                    if(t[u] == '1') {
                        for (int i = u + 1; i < v; ++i)  t[i] = '0' + ((v - i) % 2);
                        if(w & 1)  t[u + 1] = '0';
                    }
                    else if(t[u] == '0') {
                        for (int i = u + 1; i < v; ++i)  t[i] = '0' + ((v - i) % 2 == 0);
                    }
                }
                else {
                    if(t[u] == '0') {
                        for (int i = u + 1; i < v; ++i)  t[i] = '0' + ((v - i) % 2);
                    }
                    else {
                        for (int i = u + 1; i < v; ++i)  t[i] = '0' + ((v - i) % 2 == 0);
                        if(w % 2 == 0)  t[u + 1] = '0';
                    }
                }
            }
            else if(cur == k && t1 == 2) {
                for (int i = u + 1; i < v; ++i)  t[i] = '1';
                maxx -= mx;
            }
            else {
                if(t[u] != t[v]) {
                    if(t[u] == '1') {
                        for (int i = u + 1; i < v; ++i)  t[i] = '0' + ((v - i) % 2);
                        if(w & 1)  t[u + 1] = '0';
                    }
                    else if(t[u] == '0') {
                        for (int i = u + 1; i < v; ++i)  t[i] = '0' + ((v - i) % 2 == 0);
                    }
                }
                else {
                    if(t[u] == '0') {
                        for (int i = u + 1; i < v; ++i)  t[i] = '0' + ((v - i) % 2);
                    }
                    else {
                        for (int i = u + 1; i < v; ++i)  t[i] = '0' + ((v - i) % 2 == 0);
                        if(w % 2 == 0)  t[u + 1] = '0';
                    }
                }
                for (int i = u + 1; i < v && maxx != k; ++i) {
                    if(t[i] != t[i - 1] && t[i] != t[i + 1] && t[i] == '1')  maxx -= 2, t[i] = '0';
                }
                for (int i = v - 1; i > u && maxx != k; --i) {
                    if(t[i] != t[i - 1] && t[i] != t[i + 1] && t[i] == '0')  maxx -= 2, t[i] = '1';
                }
            }
        }
        res.push_back(t);
    };

    if((s[0] == '?' || s[0] == '0') && (s[n - 1] == '?' || s[n - 1] == '0'))  check('0', '0');
    if((s[0] == '?' || s[0] == '0') && (s[n - 1] == '?' || s[n - 1] == '1'))  check('0', '1');
    if((s[0] == '?' || s[0] == '1') && (s[n - 1] == '?' || s[n - 1] == '0'))  check('1', '0');
    if((s[0] == '?' || s[0] == '1') && (s[n - 1] == '?' || s[n - 1] == '1'))  check('1', '1');
    sort(res.begin(), res.end());
    if(!res.size()) {
        cout << "Impossible\n";
        return ;
    }
    cout << *res.begin() << '\n';
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);  cout.tie(0);
    int t = 1;  cin >> t;
    while(t--) {
        solve();
    }
    return 0;
}

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

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 3828kb

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: 13ms
memory: 4208kb

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