QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#182398#6683. Difficult Constructive ProblemUrgantTeam#AC ✓12ms3784kbC++233.0kb2023-09-17 22:39:042023-09-17 22:39:04

Judging History

This is the latest submission verdict.

  • [2023-09-17 22:39:04]
  • Judged
  • Verdict: AC
  • Time: 12ms
  • Memory: 3784kb
  • [2023-09-17 22:39:04]
  • Submitted

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