QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#139595 | #6683. Difficult Constructive Problem | nhuang685 | AC ✓ | 15ms | 5444kb | C++20 | 2.7kb | 2023-08-14 00:50:55 | 2023-08-14 00:50:57 |
Judging History
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