#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct point {
ll x, y;
int c;
point operator - (const point &o) const {
return {x-o.x, y-o.y};
}
};
ll cross(point a, point b) {
return a.x*b.y - b.x*a.y;
}
int ccw(const point &a, const point &b, const point &c) {
auto re = cross(b-a, c-a);
return (re > 0) - (re < 0);
}
bool upper(const point &o, const point &a) {
return a.x > o.x || (a.x == o.x && a.y > o.y);
}
int main() {
cin.tie(0)->sync_with_stdio(0);
int N; cin >> N;
vector<point> V(N);
for(auto &[x, y, c] : V) cin >> x >> y >> c;
vector<int> cnt(3, 0);
for(auto [x, y, c] : V) cnt[c]++;
ll ans = 0;
for(int i=0;i<N;i++) {
auto v = V; v.erase(v.begin() + i);
auto o = V[i];
int n = v.size();
sort(v.begin(), v.end(), [&](const auto &a, const auto &b){
if(upper(o, a) != upper(o, b)) return upper(o, a);
return ccw(o, a, b) < 0;
});
vector<int> cL = cnt, cR = {0, 0, 0};
cL[o.c]--;
for(int i=0, j=0;i<n;i++) {
if(i == j) cL[v[j].c]--, cR[v[j].c]++, j = (j+1)%n;
while(ccw(v[i], o, v[j]) > 0) cL[v[j].c]--, cR[v[j].c]++, j = (j+1)%n;
cR[v[i].c]--;
auto c1 = 3^o.c, c2 = 3^v[i].c;
ans += 1ll * (cL[c1&1] * cL[c1&2]) * (cR[c2&1] * cR[c2&2]);
cL[v[i].c]++;
}
}
cout << ans/2;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |