Submission details
Task:Frontier
Sender:Aalto CS-A1140 Team 2
Submission time:2025-11-08 15:49:11 +0200
Language:C++ (C++17)
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.00 sdetails
#2ACCEPTED0.00 sdetails
#3ACCEPTED0.00 sdetails
#4ACCEPTED0.00 sdetails
#5ACCEPTED0.00 sdetails
#6ACCEPTED0.00 sdetails
#7ACCEPTED0.00 sdetails
#8ACCEPTED0.00 sdetails
#9ACCEPTED0.00 sdetails
#10ACCEPTED0.00 sdetails
#11ACCEPTED0.00 sdetails
#12ACCEPTED0.00 sdetails
#13ACCEPTED0.00 sdetails
#14ACCEPTED0.00 sdetails
#15ACCEPTED0.00 sdetails
#16ACCEPTED0.00 sdetails
#17ACCEPTED0.01 sdetails
#18ACCEPTED0.02 sdetails
#19ACCEPTED0.02 sdetails

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:83:29: warning: unused variable 'sl' [-Wunused-variable]
   83 |                         int sl = l;
      |                             ^~
input/code.cpp:87:29: warning: unused variable 'er' [-Wunused-variable]
   87 |                         int er = r;
      |                             ^~

Code

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

void fail() {
	cout << "NO" << endl;
	exit(0);
}

using vi = vector<int>;

#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()
#define rep(i, a, b) for (int i = a; i < (b); ++i)

vi topoSort(const vector<vi>& gr) {
	vi indeg(sz(gr)), ret;
	for (auto& li : gr) for (int x : li) indeg[x]++;
	queue<int> q;
	rep(i, 0, sz(gr)) if (indeg[i] == 0) q.push(i);
	while (!q.empty()) {
		int i = q.front();
		ret.push_back(i);
		q.pop();
		for (int x : gr[i])
			if (--indeg[x] == 0) q.push(x);
	}
	if (sz(ret) < sz(gr)) return {};
	return ret;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int n, s;
	cin >> n >> s;

	s++;
	vector<vector<int>> occ(s);

	vector<int> v(n);
	for (int i = 0; i < n; ++i) {
		cin >> v[i];

		occ[v[i]].push_back(i);
	}

	vector<vector<int>> g(s);

	for (int i = 0; i < s; ++i) {
		if (!occ[i].size()) continue;
		for (int j = i + 1; j < s; ++j) {
			if (!occ[j].size()) continue;

			int min_i = occ[i].front();
			int max_i = occ[i].back();
			int min_j = occ[j].front();
			int max_j = occ[j].back();

			if (max_i < min_j) continue;
			if (max_j < min_i) continue;

			int l = max(min_i, min_j);
			int r = min(max_i, max_j);

			if (r < l) {
				continue;
			}

			{
				auto it = lower_bound(all(occ[i]), l);
				if (it == end(occ[i]) || *it > r) continue;
			}
			{
				auto it = lower_bound(all(occ[j]), l);
				if (it == end(occ[j]) || *it > r) continue;
			}

			if (v[l] == v[r]) {
				fail();
			}

			int sl = l;
			int el = *prev(upper_bound(all(occ[v[l]]), r));

			int sr = *lower_bound(all(occ[v[r]]), l);
			int er = r;

			if (el > sr) {
				fail();
			}

			g[v[l]].push_back(v[l] == i ? j : i);
		}
	}

	auto t = topoSort(g);

	if (!t.size()) fail();
	cout << "YES" << endl;
	
}

Test details

Test 1

Verdict: ACCEPTED

input
8 3
0 1 3 1 3 2 3 0

correct output
YES

user output
YES

Test 2

Verdict: ACCEPTED

input
3 1
0 1 0

correct output
YES

user output
YES

Test 3

Verdict: ACCEPTED

input
10 10
0 2 3 2 8 4 7 6 7 0

correct output
YES

user output
YES

Test 4

Verdict: ACCEPTED

input
18 100
0 95 64 79 64 68 64 88 58 88 8...

correct output
YES

user output
YES

Test 5

Verdict: ACCEPTED

input
105 1000
0 110 123 192 371 192 94 192 3...

correct output
YES

user output
YES

Test 6

Verdict: ACCEPTED

input
76 1000
0 615 320 101 56 683 391 350 3...

correct output
YES

user output
YES

Test 7

Verdict: ACCEPTED

input
112 2000
0 116 1100 256 324 256 876 256...

correct output
YES

user output
YES

Test 8

Verdict: ACCEPTED

input
115 2000
0 388 1955 1661 1417 1580 1053...

correct output
YES

user output
YES

Test 9

Verdict: ACCEPTED

input
92 2000
0 309 838 1212 553 863 553 141...

correct output
YES

user output
YES

Test 10

Verdict: ACCEPTED

input
18 10
0 3 4 10 9 4 2 8 6 8 2 7 2 9 1...

correct output
YES

user output
YES

Test 11

Verdict: ACCEPTED

input
53 100
0 1 3 82 100 25 27 85 61 53 61...

correct output
NO

user output
NO

Test 12

Verdict: ACCEPTED

input
94 1000
0 675 229 663 771 140 314 140 ...

correct output
YES

user output
YES

Test 13

Verdict: ACCEPTED

input
110 1000
0 493 827 157 538 946 1 736 31...

correct output
YES

user output
YES

Test 14

Verdict: ACCEPTED

input
96 1000
0 206 843 543 401 819 800 444 ...

correct output
NO

user output
NO

Test 15

Verdict: ACCEPTED

input
198 2000
0 1661 1800 19 1666 879 1021 9...

correct output
NO

user output
NO

Test 16

Verdict: ACCEPTED

input
538 2000
0 1138 1562 1509 1339 735 1993...

correct output
NO

user output
NO

Test 17

Verdict: ACCEPTED

input
98999 2000
0 1798 1467 884 1426 1191 601 ...

correct output
NO

user output
NO

Test 18

Verdict: ACCEPTED

input
3373 2000
0 121 0 1094 0 58 0 306 0 1273...

correct output
YES

user output
YES

Test 19

Verdict: ACCEPTED

input
3370 2000
0 1602 0 455 0 710 0 1514 0 84...

correct output
YES

user output
YES