QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#946574 | #6683. Difficult Constructive Problem | yanchengzhi | AC ✓ | 11ms | 5124kb | C++20 | 2.9kb | 2025-03-21 23:14:45 | 2025-03-21 23:14:46 |
Judging History
answer
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
void solve() {
int n, k;
string a;
cin >> n >> k;
cin >> a;
a = " " + a;
vector<int> R2(n + 1), R1(n + 1), L(n + 1), nxt(n + 2);
for(int i = n, lst = -1; i >= 1; i--) {
if(a[i] != '?') {
nxt[i] = i;
if(lst != -1) {
R1[i] = R1[lst];
R2[i] = R2[lst];
L[i] = L[lst];
if(a[i] == a[lst]) {
R2[i] += lst - i - 1 + (lst - i - 1) % 2;
}
else {
R2[i] += lst - i - 1 + ((lst - i - 1) % 2 == 0) - 1;
L[i] += 1;
}
}
else {
R1[i] = n - i;
R2[i] = 0;
L[i] = 0;
}
lst = i;
}
else {
nxt[i] = nxt[i + 1];
}
}
// cout << L[9] << ' ' << R[9] << '\n';
string ans = a;
int sum = 0;
for(int i = 1; i <= n; i++) {
if(a[i] != '?') {
sum += (i > 1 && ans[i] != ans[i - 1]);
}
else {
// try 0
int nsum = sum + (i > 1 && '0' != ans[i - 1]);
int l = 0, r1 = 0, r2 = 0;
if(!nxt[i + 1]) {
r1 += n - i;
}
else {
l += L[nxt[i + 1]];
r1 += R1[nxt[i + 1]];
r2 += R2[nxt[i + 1]];
if('0' == a[nxt[i + 1]]) {
r2 += nxt[i + 1] - i - 1 + (nxt[i + 1] - i - 1) % 2;
}
else {
l += 1;
r2 += nxt[i + 1] - i - 1 + ((nxt[i + 1] - i - 1) % 2 == 0) - 1;
}
}
// cout << i << ' ' << sum << ' ' << nsum << ' ' << l << ' ' << r << '\n';
nsum += l;
ans[i] = '1';
if(nsum <= k) {
if(k % 2 != nsum % 2) {
if(r1 > 0) {
r1--;
nsum++;
if(nsum + r1 + r2 >= k) {
ans[i] = '0';
}
}
}
else {
if(nsum + r1 + r2 >= k) {
ans[i] = '0';
}
}
}
sum += (i > 1 && ans[i] != ans[i - 1]);
}
}
// cout << ans << '\n';
if(sum != k) {
cout << "Impossible\n";
}
else {
cout << ans.substr(1, n) << '\n';
}
}
int main() {
#ifdef yczDEBUG
freopen("1.in", "r", stdin);
freopen("1.out", "w", stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
while(T--) {
solve();
}
return 0;
}
这程序好像有点Bug,我给组数据试试?
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3584kb
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: 11ms
memory: 5124kb
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