1408H - Rainbow Triples - CodeForces Solution


binary search data structures flows greedy *3300

Please click on ads to support us..

C++ Code:

#include <cstdio>

#include <vector>

#include <queue>



const int MN = 500005;



int N, A[MN], Id[MN], Z;

int lb[MN], rb[MN];

std::vector<int> vec[MN];



int main() {

	int Tests;

	scanf("%d", &Tests);

	while (Tests--) {

		scanf("%d", &N), Z = 0;

		for (int i = 1; i <= N; ++i) {

			scanf("%d", &A[i]);

			if (!A[i]) Id[++Z] = i;

		}

		if (Z <= 1) {

			puts("0");

			continue;

		}

		int pos = Id[Z / 2];

		for (int i = 1; i <= N; ++i) rb[i] = 0, lb[i] = N + 1, vec[i].clear();

		for (int i = 1; i <= pos; ++i) if (A[i]) rb[A[i]] = i;

		for (int i = N; i > pos; --i) if (A[i]) lb[A[i]] = i;

		for (int i = 1; i <= N; ++i) {

			rb[i] += N - pos;

			lb[i] -= pos;

			vec[lb[i]].push_back(rb[i]);

		}

		int Ans = 0;

		std::priority_queue<int, std::vector<int>, std::greater<int>> pq;

		for (int i = 1; i <= N; ++i) {

			for (int r : vec[i]) pq.push(r);

			while (!pq.empty() && pq.top() < i) pq.pop();

			if (!A[(i + pos - 1) % N + 1] && !pq.empty()) ++Ans, pq.pop();

		}

		printf("%d\n", std::min(Ans, Z / 2));

	}

	return 0;

}


Comments

Submit
0 Comments
More Questions

1676G - White-Black Balanced Subtrees
1716D - Chip Move
1352F - Binary String Reconstruction
1487B - Cat Cycle
1679C - Rooks Defenders
56A - Bar
1694B - Paranoid String
35A - Shell Game
1684A - Digit Minimization
43B - Letter
1017A - The Rank
1698B - Rising Sand
235A - LCM Challenge
1075B - Taxi drivers and Lyft
1562A - The Miracle and the Sleeper
1216A - Prefixes
1490C - Sum of Cubes
868A - Bark to Unlock
873B - Balanced Substring
1401D - Maximum Distributed Tree
1716C - Robot in a Hallway
1688B - Patchouli's Magical Talisman
99A - Help Far Away Kingdom
622B - The Time
1688C - Manipulating History
1169D - Good Triple
1675B - Make It Increasing
588A - Duff and Meat
1541B - Pleasant Pairs
1626B - Minor Reduction