Submission #1199261

#TimeUsernameProblemLanguageResultExecution timeMemory
119926112345678별자리 2 (JOI14_constellation2)C++20
100 / 100
814 ms800 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int nx=3e3+5; struct points { ll x, y, c; points(ll x, ll y, ll c): x(x) ,y(y), c(c){} bool turnleft(const points &o) {return (x*o.y-y*o.x>0);} bool operator< (const points &o) const { if (y>=0&&o.y<0) return 1; if (y<0&&o.y>=0) return 0; return x*o.y-y*o.x>0; } }; ll n, x[nx], y[nx], c[nx], res, tmp; int main() { cin.tie(NULL)->sync_with_stdio(false); cin>>n; for (int i=1; i<=n; i++) cin>>x[i]>>y[i]>>c[i]; for (int rt=1; rt<=n; rt++) { vector<points> v; for (int i=1; i<=n; i++) if (i!=rt) v.push_back(points(x[i]-x[rt], y[i]-y[rt], c[i])); sort(v.begin(), v.end()); vector<ll> dn(3, 0), up(3, 0); deque<points> dq; for (auto pts:v) { if (pts.y>=0) up[pts.c]++; else dn[pts.c]++, dq.push_back(pts); } for (auto pts:v) { if (!dq.empty()&&dq.front().x==pts.x&&dq.front().y==pts.y) dn[dq.front().c]--, dq.pop_front(); else up[pts.c]--; while (!dq.empty()&&pts.turnleft(dq.front())) dn[dq.front().c]--, up[dq.front().c]++, dq.pop_front(); tmp=1; for (int i=0; i<3; i++) if (pts.c!=i) tmp*=dn[i]; for (int i=0; i<3; i++) if (c[rt]!=i) tmp*=up[i]; //cout<<"heref "<<tmp<<'\n'; res+=tmp; tmp=1; for (int i=0; i<3; i++) if (pts.c!=i) tmp*=up[i]; for (int i=0; i<3; i++) if (c[rt]!=i) tmp*=dn[i]; //cout<<"heres "<<tmp<<'\n'; res+=tmp; dq.push_back(pts); dn[pts.c]++; /* cout<<"after update\n"; cout<<"up "; for (int i=0; i<3; i++) cout<<up[i]<<' '; cout<<'\n'; cout<<"down "; for (int i=0; i<3; i++) cout<<dn[i]<<' '; cout<<'\n'; cout<<"res "<<res<<'\n';*/ } //cout<<"rt "<<rt<<' '<<res<<'\n'; } cout<<res/4; } /* 7 0 0 0 2 0 1 1 2 2 -2 1 0 -2 -3 0 0 -2 1 2 -2 2 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...