QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#617004#9221. Missing Boundariesucup-team5062#WA 67ms11740kbC++203.2kb2024-10-06 13:25:022024-10-06 13:25:02

Judging History

你现在查看的是最新测评结果

  • [2024-10-06 13:25:02]
  • 评测
  • 测评结果:WA
  • 用时:67ms
  • 内存:11740kb
  • [2024-10-06 13:25:02]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

// ================================================================================ Base Function
vector<pair<int, int>> GetOutside(int L, vector<pair<int, int>> Range) {
	Range.push_back(make_pair(0, 0));
	Range.push_back(make_pair(L + 1, L + 1));
	sort(Range.begin(), Range.end());

	// Get Return
	vector<pair<int, int>> ret;
	for (int i = 1; i < (int)Range.size(); i++) {
		int cl = Range[i - 1].second + 1;
		int cr = Range[i - 0].first - 1;
		if (cl <= cr) ret.push_back(make_pair(cl, cr));
	}
	return ret;
}

bool CheckOverlap(vector<pair<int, int>> Range) {
	sort(Range.begin(), Range.end());
	int maxv = 0;
	for (int i = 0; i < (int)Range.size(); i++) {
		if (maxv >= Range[i].first) return false;
		maxv = max(maxv, Range[i].second);
	}
	return true;
}


// ================================================================================ Solve Function
string Solve(int N, int L, vector<pair<int, int>> Range) {
	// Step 1. First Check
	vector<pair<int, int>> Cand;
	vector<pair<int, int>> Cand2;
	int CountFree = 0;
	for (int i = 0; i < N; i++) {
		if (Range[i] == make_pair(-1, -1)) CountFree += 1;
		else if (Range[i].first  == -1) Cand.push_back(make_pair(Range[i].second, Range[i].second));
		else if (Range[i].second == -1) Cand.push_back(make_pair( Range[i].first,  Range[i].first));
		else {
			Cand.push_back(Range[i]);
			Cand2.push_back(Range[i]);
		}
	}
	if (CheckOverlap(Cand) == false) return "NIE";

	// Step 2. Get Ranges
	vector<pair<int, int>> Free = GetOutside(L, Cand2);
	vector<vector<pair<int, char>>> List(Free.size(), vector<pair<int, char>>(0));
	for (int i = 0; i < N; i++) {
		if (Range[i] == make_pair(-1, -1)) continue;
		if (Range[i].first == -1) {
			int pos = Range[i].second;
			int idx = lower_bound(Free.begin(), Free.end(), make_pair(pos, (1 << 30))) - Free.begin();
			idx--;
			List[idx].push_back(make_pair(pos, 'R'));
		}
		if (Range[i].second == -1) {
			int pos = Range[i].first;
			int idx = lower_bound(Free.begin(), Free.end(), make_pair(pos, (1 << 30))) - Free.begin();
			idx--;
			List[idx].push_back(make_pair(pos, 'L'));
		}
	}
	for (int i = 0; i < (int)Free.size(); i++) sort(List[i].begin(), List[i].end());

	// Step 3. Get Max
	int MaxVal = L;
	int MinVal = 0;
	for (int i = 0; i < (int)Cand.size(); i++) MaxVal -= (Cand[i].second - Cand[i].first + 1);
	for (int i = 0; i < (int)Free.size(); i++) {
		if (List[i].size() == 0) MinVal += 1;
		else {
			int cl = Free[i].first;
			int cr = Free[i].second;
			int x = (int)List[i].size() - 1;
			if (List[i][0].first != cl && List[i][0].second == 'L') MinVal += 1;
			if (List[i][x].first != cr && List[i][x].second == 'R') MinVal += 1;
		}
	}

	// Step 4. Final Check
	if (MinVal <= CountFree && CountFree <= MaxVal) return "TAK";
	return "NIE";
}


// ================================================================================ Solve Function
int main() {
	int T; cin >> T;
	for (int t = 1; t <= T; t++) {
		int N; scanf("%d", &N);
		int L; scanf("%d", &L);
		vector<pair<int, int>> Ranges(N, make_pair(0, 0));
		for (int i = 0; i < N; i++) scanf("%d%d", &Ranges[i].first, &Ranges[i].second);
		cout << Solve(N, L, Ranges) << endl;
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3652kb

input:

3
4 51
1 -1
11 50
-1 -1
-1 10
3 2
-1 -1
-1 -1
-1 -1
2 3
1 2
2 3

output:

TAK
NIE
NIE

result:

ok 3 lines

Test #2:

score: 0
Accepted
time: 67ms
memory: 11740kb

input:

1
200000 1000000000
490669427 -1
224278942 224287156
821104480 -1
861696576 861702036
807438935 807440055
574078002 574083717
465630141 -1
195378188 -1
-1 13500961
-1 977536179
92893115 -1
-1 661145418
-1 215804863
-1 685338515
544348999 -1
465532902 -1
130346949 -1
-1 526666304
635604584 635605404
...

output:

TAK

result:

ok single line: 'TAK'

Test #3:

score: 0
Accepted
time: 0ms
memory: 3640kb

input:

3
4 51
1 -1
11 50
-1 -1
-1 10
3 2
-1 -1
-1 -1
-1 -1
2 3
1 2
2 3

output:

TAK
NIE
NIE

result:

ok 3 lines

Test #4:

score: 0
Accepted
time: 53ms
memory: 11476kb

input:

1
197838 400000
34167 34169
352180 -1
235963 -1
-1 -1
160401 160405
347288 -1
270353 270354
214502 214504
183243 183245
-1 -1
-1 36193
-1 -1
-1 17557
273498 273500
269137 -1
395099 395100
285515 285518
-1 -1
71041 71042
324060 -1
-1 385151
-1 379645
-1 -1
-1 185142
-1 191584
89259 89261
328347 32834...

output:

TAK

result:

ok single line: 'TAK'

Test #5:

score: 0
Accepted
time: 33ms
memory: 6900kb

input:

2
97340 150000
-1 101927
105937 -1
-1 107253
-1 47307
110550 -1
84061 84062
125176 125177
-1 15915
29617 -1
-1 -1
-1 43147
115958 -1
101807 101808
24866 -1
66826 66828
-1 31640
-1 5610
1281 1284
-1 -1
-1 -1
-1 73973
-1 2945
29064 -1
30653 -1
-1 63714
-1 -1
141389 141390
-1 27465
57358 -1
47388 47389...

output:

NIE
NIE

result:

ok 2 lines

Test #6:

score: -100
Wrong Answer
time: 40ms
memory: 5584kb

input:

4
50000 50000
11702 -1
-1 3148
30364 -1
48876 -1
-1 10739
-1 44459
11634 -1
39348 -1
38829 -1
16182 -1
37933 -1
35295 -1
43280 -1
37745 -1
-1 40076
358 -1
14043 -1
13975 -1
41942 -1
-1 13182
14780 -1
-1 14663
3998 -1
-1 24474
-1 6583
-1 9620
-1 37944
12103 -1
8307 -1
45760 -1
-1 2924
25441 -1
-1 194...

output:

TAK
NIE
NIE
TAK

result:

wrong answer 4th lines differ - expected: 'NIE', found: 'TAK'