QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#118026#6683. Difficult Constructive ProblemUndertrainedOverpressure#AC ✓124ms5064kbC++206.0kb2023-07-02 22:03:492023-07-02 22:03:53

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-02 22:03:53]
  • Judged
  • Verdict: AC
  • Time: 124ms
  • Memory: 5064kb
  • [2023-07-02 22:03:49]
  • Submitted

answer

/*
    author:  Maksim1744
    created: 02.07.2023 16:47:17
*/

#include "bits/stdc++.h"

using namespace std;

using ll = long long;
using ld = long double;

#define mp   make_pair
#define pb   push_back
#define eb   emplace_back

#define sum(a)     ( accumulate ((a).begin(), (a).end(), 0ll))
#define mine(a)    (*min_element((a).begin(), (a).end()))
#define maxe(a)    (*max_element((a).begin(), (a).end()))
#define mini(a)    ( min_element((a).begin(), (a).end()) - (a).begin())
#define maxi(a)    ( max_element((a).begin(), (a).end()) - (a).begin())
#define lowb(a, x) ( lower_bound((a).begin(), (a).end(), (x)) - (a).begin())
#define uppb(a, x) ( upper_bound((a).begin(), (a).end(), (x)) - (a).begin())

template<typename T>             vector<T>& operator--            (vector<T> &v){for (auto& i : v) --i;            return  v;}
template<typename T>             vector<T>& operator++            (vector<T> &v){for (auto& i : v) ++i;            return  v;}
template<typename T>             istream& operator>>(istream& is,  vector<T> &v){for (auto& i : v) is >> i;        return is;}
template<typename T>             ostream& operator<<(ostream& os,  vector<T>  v){for (auto& i : v) os << i << ' '; return os;}
template<typename T, typename U> pair<T,U>& operator--           (pair<T, U> &p){--p.first; --p.second;            return  p;}
template<typename T, typename U> pair<T,U>& operator++           (pair<T, U> &p){++p.first; ++p.second;            return  p;}
template<typename T, typename U> istream& operator>>(istream& is, pair<T, U> &p){is >> p.first >> p.second;        return is;}
template<typename T, typename U> ostream& operator<<(ostream& os, pair<T, U>  p){os << p.first << ' ' << p.second; return os;}
template<typename T, typename U> pair<T,U> operator-(pair<T,U> a, pair<T,U> b){return mp(a.first-b.first, a.second-b.second);}
template<typename T, typename U> pair<T,U> operator+(pair<T,U> a, pair<T,U> b){return mp(a.first+b.first, a.second+b.second);}
template<typename T, typename U> void umin(T& a, U b){if (a > b) a = b;}
template<typename T, typename U> void umax(T& a, U b){if (a < b) a = b;}

#ifdef HOME
#define SHOW_COLORS
#include "/mnt/c/Libs/tools/print.cpp"
#else
#define show(...) void(0)
#define debugf(fun)   fun
#define debugv(var)   var
#define mclock    void(0)
#define shows     void(0)
#define debug  if (false)
#define OSTREAM(...)    ;
#define OSTREAM0(...)   ;
#endif

void test_case(int test) {
    int n, kk;
    cin >> n >> kk;
    string ss;
    cin >> ss;

    string best;

    for (int c0 = 0; c0 < 2; ++c0) {
        if (ss[0] != '?' && ss[0] != '0' + c0) continue;
        for (int c1 = 0; c1 < 2; ++c1) {
            if (ss.back() != '?' && ss.back() != '0' + c1) continue;
            if (n == 1 && c0 != c1) continue;

            auto s = ss;
            int k = kk;

            s[0] = c0 + '0';
            s.back() = c1 + '0';
            for (int i = 0; i < n - 1; ++i) {
                if (s.substr(i, 2) == "01" || s.substr(i, 2) == "10")
                    --k;
            }
            if (k < 0) continue;

            array<multiset<int>, 2> sets = {};
            array<int, 2> sums = {};

            auto trans = [&](int& len, int par) {
                if (par == 0) {
                    len = (len - 1) / 2 * 2 + 2;
                } else {
                    len = len / 2 * 2 + 1;
                }
            };

            auto add = [&](int len, int par) {
                if (len == 0) return;
                trans(len, par);
                sets[par].insert(len);
                sums[par] += len;
            };

            auto rem = [&](int len, int par) {
                if (len == 0) return;
                trans(len, par);
                sets[par].erase(sets[par].find(len));
                sums[par] -= len;
            };

            vector<int> r(n);
            for (int i = n - 1; i >= 0; --i) {
                if (s[i] == '?') r[i] = r[i + 1];
                else r[i] = i;
            }

            for (int i = 1; i < n; ++i) {
                if (s[i - 1] != '?' && s[i] == '?')
                    add(r[i] - i, s[r[i]] != s[i - 1]);
            }

            auto can = [&]() {
                if (k < 0) return false;
                int ss = sums[0] + sums[1];
                if (ss % 2 != k % 2) return false;
                return ss >= k && sets[1].size() <= k;
            };

            shows;

            if (!can()) {
                continue;
            }

            show(s);
            show(k);
            show(sets);
            show(sums);
            show(r);

            for (int i = 0; i < n; ++i) {
                show(i);
                if (s[i] != '?') {
                    continue;
                }
                bool ok = false;
                show(sets, sums, k, s);
                for (int c = 0; c < 2; ++c) {
                    rem(r[i] - i, s[r[i]] != s[i - 1]);
                    s[i] = '0' + c;
                    add(r[i] - i - 1, s[r[i]] != s[i]);
                    if (s[i] != s[i - 1]) --k;
                    if (s[i] != s[i + 1] && s[i + 1] != '?') --k;
                    if (can()) {
                        ok = true;
                        break;
                    }
                    if (s[i] != s[i - 1]) ++k;
                    if (s[i] != s[i + 1] && s[i + 1] != '?') ++k;
                    rem(r[i] - i - 1, s[r[i]] != s[i]);
                    s[i] = '?';
                    add(r[i] - i, s[r[i]] != s[i - 1]);
                }
                assert(ok);
            }
            assert(k == 0);
            if (best.empty() || s < best)
                best = s;
        }
    }

    if (best.empty()) {
        cout << "Impossible\n";
    } else {
        cout << best << '\n';
    }
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);

    int T;
    cin >> T;
    for (int test = 1; test <= T; ++test) {
        test_case(test);
    }

    return 0;
}

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

詳細信息

Test #1:

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

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: 124ms
memory: 5064kb

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