제출 #151226

#제출 시각아이디문제언어결과실행 시간메모리
151226dongwon0427함수컵 박물관 (FXCUP4_museum)C++17
100 / 100
262 ms24216 KiB
#include "museum.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node {
    int a,b,c;
    bool operator < (const node &n) const {
        if(a == n.a) {
            if(b == n.b) return c < n.c;
            return b < n.b;
        }
        return a < n.a;
    }
    bool operator == (const node &n) const {
        return a == n.a && b==n.b && c==n.c;
    }
};

vector<node> a,b,c,d,e,f,g;
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++) {
        a.push_back({B[i],-1,-1});
	}
	for(int i=0;i<n;i++) {
        b.push_back({-1,T[i],-1});
	}
	for(int i=0;i<n;i++) {
        c.push_back({-1,-1,G[i]});
	}
	for(int i=0;i<n;i++) {
        d.push_back({B[i],T[i],-1});
	}
	for(int i=0;i<n;i++) {
        e.push_back({B[i],-1,G[i]});
	}
	for(int i=0;i<n;i++) {
        f.push_back({-1,T[i],G[i]});
	}
	for(int i=0;i<n;i++) {
        g.push_back({B[i],T[i],G[i]});
	}
	sort(a.begin(), a.end());
	sort(b.begin(), b.end());
	sort(c.begin(), c.end());
	sort(d.begin(), d.end());
	sort(e.begin(), e.end());
	sort(f.begin(), f.end());
	sort(g.begin(), g.end());

	ll ret = 0;
	ll cnt = 0;
	node bf = {-1,-1,-1};
	for(int i=0;i<n;i++) {
        if(bf == a[i]) {
            cnt++;
        } else {
            ret += cnt * (cnt-1) / 2;
            cnt = 1;
            bf = a[i];
        }
	}
	ret += cnt * (cnt-1) / 2;

	cnt = 0;
	bf = {-1,-1,-1};
	for(int i=0;i<n;i++) {
        if(bf == b[i]) {
            cnt++;
        } else {
            ret += cnt * (cnt-1) / 2;
            cnt = 1;
            bf = b[i];
        }
	}
	ret += cnt * (cnt-1) / 2;

	cnt = 0;
	bf = {-1,-1,-1};
	for(int i=0;i<n;i++) {
        if(bf == c[i]) {
            cnt++;
        } else {
            ret += cnt * (cnt-1) / 2;
            cnt = 1;
            bf = c[i];
        }
	}
	ret += cnt * (cnt-1) / 2;

	cnt = 0;
	bf = {-1,-1,-1};
	for(int i=0;i<n;i++) {
        if(bf == d[i]) {
            cnt++;
        } else {
            ret -= cnt * (cnt-1) / 2;
            cnt = 1;
            bf = d[i];
        }
	}
	ret -= cnt * (cnt-1) / 2;

	cnt = 0;
	bf = {-1,-1,-1};
	for(int i=0;i<n;i++) {
        if(bf == e[i]) {
            cnt++;
        } else {
            ret -= cnt * (cnt-1) / 2;
            cnt = 1;
            bf = e[i];
        }
	}
	ret -= cnt * (cnt-1) / 2;

	cnt = 0;
	bf = {-1,-1,-1};
	for(int i=0;i<n;i++) {
        if(bf == f[i]) {
            cnt++;
        } else {
            ret -= cnt * (cnt-1) / 2;
            cnt = 1;
            bf = f[i];
        }
	}
	ret -= cnt * (cnt-1) / 2;

	cnt = 0;
	bf = {-1,-1,-1};
	for(int i=0;i<n;i++) {
        if(bf == g[i]) {
            cnt++;
        } else {
            ret += cnt * (cnt-1) / 2;
            cnt = 1;
            bf = g[i];
        }
	}
	ret += cnt * (cnt-1) / 2;
	return ret;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...