Submission #149430

#TimeUsernameProblemLanguageResultExecution timeMemory
149430티셔츠 콜렉터 (#200)FunctionCup Museum (FXCUP4_museum)C++17
100 / 100
181 ms8932 KiB
#include "museum.h"
#include <algorithm>

struct data {
	int b, t, g;
};
bool cmp1(const data& a, const data& b) {
	if (a.b < b.b) return true;
	if (a.b == b.b) {
		if (a.t < b.t) return true;
		if (a.t == b.t) return a.g < b.g;
	}
	return false;
}
bool cmp2(const data& a, const data& b) {
	if (a.t < b.t) return true;
	if (a.t == b.t) {
		if (a.g < b.g) return true;
		if (a.g == b.g) return a.b < b.b;
	}
	return false;
}
bool cmp3(const data& a, const data& b) {
	if (a.g < b.g) return true;
	if (a.g == b.g) {
		if (a.b < b.b) return true;
		if (a.b == b.b) return a.t < b.t;
	}
	return false;
}

std::vector<data> V;
long long CountSimilarPairs(std::vector<int> B, std::vector<int> T, std::vector<int> G) {
	int N = B.size();
	for (int i=0; i<N; i++) {
		V.push_back({B[i], T[i], G[i]});
	}
	long long res = 0;
	std::sort(V.begin(), V.end(), cmp1);
	long long cnt1=1, cnt2=1, cnt3=1;
	for (int i=1; i<N; i++) {
		if (V[i].b == V[i-1].b) {
			cnt1++;
			if (V[i].t == V[i-1].t) {
				cnt2++;
				if (V[i].g == V[i-1].g) {
					cnt3++;
				} else {
					res += cnt3*(cnt3-1)/2;
					cnt3=1;
				}
			} else {
				res -= cnt2*(cnt2-1)/2;
				res += cnt3*(cnt3-1)/2;
				cnt2=cnt3=1;
			}
		} else {
			res += cnt1*(cnt1-1)/2;
			res -= cnt2*(cnt2-1)/2;
			res += cnt3*(cnt3-1)/2;
			cnt1=cnt2=cnt3=1;
		}
	}
	res += cnt1*(cnt1-1)/2;
	res -= cnt2*(cnt2-1)/2;
	res += cnt3*(cnt3-1)/2;
	cnt1=cnt2=cnt3=1;
	std::sort(V.begin(), V.end(), cmp2);
	for (int i=1; i<N; i++) {
		if (V[i].t == V[i-1].t) {
			cnt1++;
			if (V[i].g == V[i-1].g) {
				cnt2++;
			} else {
				res -= cnt2*(cnt2-1)/2;
				cnt2=1;
			}
		} else {
			res += cnt1*(cnt1-1)/2;
			res -= cnt2*(cnt2-1)/2;
			cnt1=cnt2=1;
		}
	}
	res += cnt1*(cnt1-1)/2;
	res -= cnt2*(cnt2-1)/2;
	cnt1=cnt2=1;
	std::sort(V.begin(), V.end(), cmp3);
	cnt1=1, cnt2=1, cnt3=1;
	for (int i=1; i<N; i++) {
		if (V[i].g == V[i-1].g) {
			cnt1++;
			if (V[i].b == V[i-1].b) {
				cnt2++;
			} else {
				res -= cnt2*(cnt2-1)/2;
				cnt2=1;
			}
		} else {
			res += cnt1*(cnt1-1)/2;
			res -= cnt2*(cnt2-1)/2;
			cnt1=cnt2=1;
		}
	}
	res += cnt1*(cnt1-1)/2;
	res -= cnt2*(cnt2-1)/2;

	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...