이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
using LL = long long;
const int NStar = (int)3e3 + 5;
int nStar;
LL ans;
vector<int> num(3, 0);
struct Star {
int x, y, c;
Star(int _x = 0, int _y = 0, int _c = 0) : x(_x), y(_y), c(_c) {}
Star operator-(const Star &_) const { return Star(x - _.x, y - _.y, c); }
Star operator+(const Star &_) const { return Star(x + _.x, y + _.y, c); }
LL operator^(const Star &_) const { return (LL)x * _.y - (LL)y * _.x; }
bool operator<(const Star &_) const {
auto up = [&](Star a) { return a.y > 0 || (!a.y && a.x > 0); };
if (up(*this) != up(_) ) return up(*this) > up(_);
else return (*this ^ _) > 0;
}
void print() { cerr << x << ' ' << y << ' ' << c << '\n'; }
} initStar[NStar];
int main() {
// freopen("input", "r", stdin);
scanf(" %d", &nStar);
for (int i = 1; i <= nStar; ++i) {
scanf(" %d %d %d", &initStar[i].x, &initStar[i].y, &initStar[i].c);
++num[ initStar[i].c ];
}
for (int origin = 1; origin <= nStar; ++origin) {
// initStar[origin].print();
vector<Star> star;
for (int i = 1; i <= nStar; ++i) if (i != origin) {
star.push_back(initStar[i] - initStar[origin]);
}
sort(star.begin(), star.end() );
// for (auto aStar : star) (aStar + initStar[origin]).print(); cerr << '\n';
vector<int> cnt(3, 0);
auto nxt = [&](int _i, int _n) { return _i == _n - 1 ? 0 : _i + 1; };
for (int i = 0, j = 0; i < (int)star.size(); ++i) {
--cnt[ star[i].c ];
if (i == j) {
++cnt[ star[j].c ];
j = nxt(j, (int)star.size() );
}
while (j != i && (star[i] ^ star[j]) > 0) {
++cnt[ star[j].c ];
j = nxt(j, (int)star.size() );
}
vector<int> L = cnt, R(3, 0);
for (int c = 0; c < 3; ++c) R[c] = num[c] - cnt[c];
--R[ initStar[origin].c ]; --R[ star[i].c ];
LL ret = 1;
for (int c = 0; c < 3; ++c) if (c != star[i].c) ret *= L[c];
for (int c = 0; c < 3; ++c) if (c != initStar[origin].c) ret *= R[c];
// cerr << i << ' ' << j << " == ";
// for (int c = 0; c < 3; ++c) cerr << L[c] << ' ';
// for (int c = 0; c < 3; ++c) cerr << R[c] << ' '; cerr << '\n';
ans += ret;
}
// cerr << "ans = " << ans << '\n';
}
cout << ans / 2;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
constellation2.cpp: In function 'int main()':
constellation2.cpp:29:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf(" %d", &nStar);
~~~~~^~~~~~~~~~~~~~~
constellation2.cpp:31:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf(" %d %d %d", &initStar[i].x, &initStar[i].y, &initStar[i].c);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |