QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#726129 | #6683. Difficult Constructive Problem | crazymoon | AC ✓ | 13ms | 4208kb | C++20 | 4.4kb | 2024-11-08 21:47:35 | 2024-11-08 21:47:36 |
Judging History
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