QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#139595#6683. Difficult Constructive Problemnhuang685AC ✓15ms5444kbC++202.7kb2023-08-14 00:50:552023-08-14 00:50:57

Judging History

This is the latest submission verdict.

  • [2023-08-14 00:50:57]
  • Judged
  • Verdict: AC
  • Time: 15ms
  • Memory: 5444kb
  • [2023-08-14 00:50:55]
  • Submitted

answer

/**
 * @file qoj6683_1.cpp
 * @author n685
 * @brief
 * @date 2023-08-13
 *
 *
 */
#include <bits/stdc++.h>

#ifdef LOCAL
std::ifstream cin;
std::ofstream cout;
using std::cerr;
#else
using std::cin;
using std::cout;
#define cerr                                                                   \
  if (false)                                                                   \
  std::cerr
#endif

std::string ans;
bool g = false;

void slv(int n, int k, std::string s) {
  auto val = [&s](int ind) { return s[ind] - '0'; };
  std::vector<std::array<int, 2>> f(n), gg(n);
  f[n - 1][1 - val(n - 1)] = (int)1e9;
  gg[n - 1][1 - val(n - 1)] = -(int)1e9;
  for (int i = n - 2; i >= 0; --i) {
    if (s[i] == '?') {
      for (int j : {0, 1}) {
        f[i][j] = std::min(f[i + 1][j], f[i + 1][1 - j] + 1);
        gg[i][j] = std::max(gg[i + 1][j], gg[i + 1][1 - j] + 1);
      }
    } else {
      int v = val(i);
      f[i][v] = std::min(f[i + 1][v], f[i + 1][1 - v] + 1);
      gg[i][v] = std::max(gg[i + 1][v], gg[i + 1][1 - v] + 1);
      f[i][1 - v] = (int)1e9;
      gg[i][1 - v] = -(int)1e9;
    }
  }

  if (f[0][val(0)] % 2 != k % 2)
    return;
  else if (f[0][val(0)] > k || gg[0][val(0)] < k)
    return;
  std::string l = s;
  int pre = 0;
  for (int i = 1; i < n - 1; ++i) {
    if (l[i] == '?') {
      for (char c : {'0', '1'}) {
        int a = (c != l[i - 1]);
        if (f[i][c - '0'] + pre + a <= k && k <= gg[i][c - '0'] + pre + a) {
          l[i] = c;
          break;
        }
      }
    }
    if (l[i] == '?')
      return;
    pre += (l[i] != l[i - 1]);
  }
  g = true;
  ans = std::min(ans, l);
}

void solve() {
  g = false;

  int n, k;
  cin >> n >> k;
  ans.assign(n, '1');

  std::string s;
  cin >> s;
  if (n == 1) {
    if (s == "?")
      cout << "0\n";
    else
      cout << s << '\n';
    return;
  }

  if (s[0] == '?') {
    if (s.back() == '?') {
      for (char c : {'0', '1'}) {
        s[0] = c;
        for (char d : {'0', '1'}) {
          s.back() = d;
          slv(n, k, s);
        }
      }
    } else {
      for (char c : {'0', '1'}) {
        s[0] = c;
        slv(n, k, s);
      }
    }
  } else {
    if (s.back() == '?') {
      for (char d : {'0', '1'}) {
        s.back() = d;
        slv(n, k, s);
      }
    } else
      slv(n, k, s);
  }
  if (!g)
    cout << "Impossible\n";
  else
    cout << ans << '\n';
}

int main() {
#ifdef LOCAL
  cin.open("input.txt");
  cout.rdbuf()->pubsetbuf(0, 0);
  cout.open("output.txt");
#else
  cin.tie(nullptr)->sync_with_stdio(false);
#endif

  int t;
  cin >> t;
  while (t--)
    solve();
}

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

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 15ms
memory: 5444kb

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