QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#182398 | #6683. Difficult Constructive Problem | UrgantTeam# | AC ✓ | 12ms | 3784kb | C++23 | 3.0kb | 2023-09-17 22:39:04 | 2023-09-17 22:39:04 |
Judging History
answer
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define x first
#define y second
using namespace std;
typedef long double ld;
typedef long long ll;
string s;
int total, A, B, C, Dxx, Dxy, K;
void add_seg(int lef, int rig, int n)
{
if (lef == 0 && rig == n - 1) A = rig - lef + 1;
else if (lef == 0) B = rig - lef + 1;
else if (rig == n - 1) C = rig - lef + 1;
else
{
char a = s[lef - 1], b = s[rig + 1];
if (a == b) Dxx += (rig - lef + 2) / 2;
else K++, Dxy += (rig - lef + 1) / 2;
}
return;
}
void erase_seg(int lef, int rig, int n)
{
if (lef == 0 && rig == n - 1) A = 0;
else if (lef == 0) B = 0;
else if (rig == n - 1) C = 0;
else
{
char a = s[lef - 1], b = s[rig + 1];
if (a == b) Dxx -= (rig - lef + 2) / 2;
else K--, Dxy -= (rig - lef + 1) / 2;
}
return;
}
void set_val(int pos, char val, int n)
{
if (pos != 0 && s[pos - 1] != '?' && s[pos] != '?' && s[pos - 1] != s[pos]) total--;
if (pos != n - 1 && s[pos] != '?' && s[pos + 1] != '?' && s[pos] != s[pos + 1]) total--;
s[pos] = val;
if (pos != 0 && s[pos - 1] != '?' && s[pos] != '?' && s[pos - 1] != s[pos]) total++;
if (pos != n - 1 && s[pos] != '?' && s[pos + 1] != '?' && s[pos] != s[pos + 1]) total++;
return;
}
bool check_ok(int k)
{
if (A != 0) return (0 <= k) && (k < A);
if (B == 0 && C == 0)
{
int lef = total + K, rig = total + K + 2 * (Dxx + Dxy);
return (lef <= k) && (k <= rig) && (k % 2 == lef % 2);
}
else
{
int lef = total + K, rig = total + K + B + C + 2 * (Dxx + Dxy);
return (lef <= k) && (k <= rig);
}
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
ios_base::sync_with_stdio(0); cin.tie(0);
int test;
cin >> test;
for (int rep = 1; rep <= test; rep++)
{
int n, k;
cin >> n >> k;
cin >> s;
total = A = B = C = Dxx = Dxy = K = 0;
vector <pair <int, int> > seg;
int fir = -1, last = -1;
for (int i = 0; i < n; i++)
{
if (s[i] == '?')
{
if (fir == -1) fir = i;
last = i;
}
else
{
if (last != -1) seg.pb(mp(fir, last));
fir = last = -1;
}
}
if (fir != -1) seg.pb(mp(fir, last));
for (const auto &[lef, rig] : seg)
add_seg(lef, rig, n);
for (int i = 0; i < n - 1; i++)
if (s[i] != '?' && s[i + 1] != '?' && s[i] != s[i + 1]) total++;
if (!check_ok(k)) {cout << "Impossible\n"; continue;}
for (const auto &[lef, rig] : seg)
{
for (int bound = lef; bound <= rig; bound++)
{
//cout << A << ' ' << B << ' ' << C << ' ' << Dxx << ' ' << Dxy << ' ' << K << ' ' << total << '\n';
erase_seg(bound, rig, n);
set_val(bound, '0', n);
if (bound != rig) add_seg(bound + 1, rig, n);
if (!check_ok(k))
{
if (bound != rig) erase_seg(bound + 1, rig, n);
set_val(bound, '1', n);
if (bound != rig) add_seg(bound + 1, rig, n);
}
}
}
cout << s << '\n';
}
return 0;
}
这程序好像有点Bug,我给组数据试试?
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3784kb
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: 12ms
memory: 3736kb
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