Submission #115158

#TimeUsernameProblemLanguageResultExecution timeMemory
115158NnandiPrinted Circuit Board (CEOI12_circuit)C++14
80 / 100
315 ms16492 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; struct Pont { ll x, y; int id; void olvas(int i) { id = i; cin>>x>>y; } bool operator== (Pont masik) { return id == masik.id; } }; Pont vec(Pont a, Pont b) { b.x -= a.x; b.y -= a.y; return b; } int sgn(ll exp) { if(0LL < exp) return 1; if(exp < 0LL) return -1; return 0; } int Irany(Pont o, Pont a, Pont b) { a = vec(o,a); b = vec(o,b); ll cp = a.x * b.y - a.y * b.x; return sgn(cp); } bool Kozte(Pont a, Pont b, Pont c) { a = vec(b,a); c = vec(b,c); if(sgn(a.x) == -sgn(c.x) && sgn(a.x) != 0) return true; if(sgn(a.y) == -sgn(c.y) && sgn(a.y) != 0) return true; return false; } Pont sp; bool kisebb(Pont p, Pont q) { int dir = Irany(sp,p,q); if(dir != 0) { return dir == 1; } return Kozte(sp,p,q); } struct Szak{ Pont a, b; Szak() { } Szak(Pont aa, Pont bb) { a = aa; b = bb; } const bool operator< (Szak M) const { if(a.id == M.a.id && b.id == M.b.id) return false; if(a.id == M.b.id && b.id == M.a.id) return false; if(M.a == a) { return Irany(M.a,M.b,b) == 1; } if(M.b == b) { return Irany(M.b,M.a,a) == -1; } if(M.a == b) { return a.id < M.b.id; } if(M.b == a) { return b.id < M.a.id; } if(Irany(a,b,M.a) == 0 && Irany(a,b,M.b) == 0 && Irany(a, b, sp) == 0) { if(Kozte(sp,a,M.a) && Kozte(sp,b,M.a)) return true; if(Kozte(sp,M.a,a) && Kozte(sp,M.b,a)) return false; } if(Irany(M.a, M.b, a) == Irany(M.a, M.b, b)) return Irany(M.a, M.b, a) == 1; if(Irany(a,b,M.a) == Irany(a,b,M.b)) return Irany(a, b, M.a) == -1; return false; } }; const int maxn = 200005; int n; Pont t[maxn]; Pont v[maxn]; bool sol[maxn]; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n; for(int i=1;i<=n;i++) { t[i].olvas(i); v[i] = t[i]; } t[n+1] = t[1]; t[0] = t[n]; sort(v+1,v+n+1,kisebb); set<Szak> H; for(int i=1;i<=n;i++) { int idj = v[i].id; if(Irany(sp,t[idj],t[idj+1]) >= 0) { Szak uj(t[idj],t[idj+1]); H.insert(uj); } if(Irany(sp,t[idj],t[idj-1]) >= 0) { Szak uj(t[idj],t[idj-1]); H.insert(uj); } Szak k = *H.begin(); int dir = Irany(sp,k.a,k.b); if(dir == 0 && k.a.id == idj && Kozte(sp,k.a,k.b)) sol[idj] = true; if(dir == 0 && k.b.id == idj && Kozte(sp,k.b,k.a)) sol[idj] = true; if(dir != 0 && k.a.id == idj) sol[idj] = true; if(dir != 0 && k.b.id == idj) sol[idj] = true; if(Irany(sp,t[idj],t[idj+1]) <= 0) { Szak re(t[idj+1],t[idj]); H.erase(re); } if(Irany(sp,t[idj],t[idj-1]) <= 0) { Szak re(t[idj-1],t[idj]); H.erase(re); } } int db = 0; for(int i=1;i<=n;i++) { if(sol[i]) db++; } cout<<db<<endl; for(int i=1;i<=n;i++) { if(sol[i]) { cout<<i<<" "; } } cout<<endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...