Submission #570560

#TimeUsernameProblemLanguageResultExecution timeMemory
570560balbitIOI Fever (JOI21_fever)C++14
37 / 100
5057 ms5724 KiB
#include <bits/stdc++.h> #define int ll using namespace std; #define ll long long #define y1 zck_is_king #define pii pair<ll, ll> #define ull unsigned ll #define f first #define s second #define ALL(x) x.begin(),x.end() #define SZ(x) (int)x.size() #define SQ(x) (x)*(x) #define MN(a,b) a = min(a,(__typeof__(a))(b)) #define MX(a,b) a = max(a,(__typeof__(a))(b)) #define pb push_back #define REP(i,n) for (int i = 0; i<n; ++i) #define RREP(i,n) for (int i = n-1; i>=0; --i) #define REP1(i,n) for (int i = 1; i<=n; ++i) #define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end())))) #ifdef BALBIT #define IOS() #define bug(...) fprintf(stderr,"#%d (%s) = ",__LINE__,#__VA_ARGS__),_do(__VA_ARGS__); template<typename T> void _do(T &&x){cerr<<x<<endl;} template<typename T, typename ...S> void _do(T &&x, S &&...y){cerr<<x<<", ";_do(y...);} #else #define IOS() ios_base::sync_with_stdio(0);cin.tie(0); #define endl '\n' #define bug(...) #endif const int iinf = 1e9+10; const ll inf = 0x3f3f3f3f3f3f3f3f; const ll mod = 1e9+7 ; void GG(){cout<<"0\n"; exit(0);} ll mpow(ll a, ll n, ll mo = mod){ // a^n % mod ll re=1; while (n>0){ if (n&1) re = re*a %mo; a = a*a %mo; n>>=1; } return re; } ll inv (ll b, ll mo = mod){ if (b==1) return b; return (mo-mo/b) * inv(mo%b,mo) % mo; } const int maxn = 1e5+5; int n; struct pt{ int x,y; void in(){ cin>>x>>y; x*=2; y*=2; } int dist(pt &o) { return abs(o.x-x) + abs(o.y-y); } }; pt P[maxn]; ll dst[maxn]; int dir[maxn]; bool done[maxn]; pii D4[4] = {{1,0}, {0,1}, {-1,0}, {0,-1}}; pii Dia4[4] = {{1,1},{-1,1},{-1,-1},{1,-1}}; inline int diagof(pii & p) { return find(Dia4, Dia4+4, p) - Dia4; } inline int F4(int x) { return x<0?x+4:(x>=4?x-4:x); } int run(int idir){ bug(idir); dir[0] = idir; memset(done, 0, sizeof done); REP1(i,n-1) { int x = P[i].x, y = P[i].y; if (x == y || x == -y) { assert(x && y); pii tmp = {x/abs(x), y/abs(x)}; int at = diagof(tmp); if (at == idir) { dir[i] = F4(idir-1); }else if (at == F4(idir-1)) { dir[i] = F4(idir+1); }else{ dir[i] = idir; } }else{ dir[i] = (y<x?vector<int>{1,2}:vector<int>{0,3})[y>-x]; } bug(i, dir[i]); } priority_queue<pii, vector<pii>, greater<pii> > pq; pq.push({0,0}); memset(dst, 0x3f, sizeof dst); dst[0] = 0; auto UPD = [&](int u, int d) { if (dst[u] > d) { dst[u] = d; pq.push({dst[u], u}); } }; while (!pq.empty()) { int v = pq.top().s; ll w = pq.top().f; pq.pop(); if (done[v] || dst[v] != w) continue; done[v] = 1; REP(u,n) { if(!done[u]) { int todst = P[v].dist(P[u])/2; if (todst < dst[v]) { continue; // touch too early to count } int mydir = dir[v]; int x = P[u].x - P[v].x, y = P[u].y - P[v].y; if (x == y || x == -y) { assert(x && y); pii tmp = {x/abs(x), y/abs(x)}; int at = diagof(tmp); if (at == mydir) { if (dir[u] == F4(mydir-1)) { UPD(u,todst); } }else if (at == F4(mydir-1)) { if (dir[u] == F4(mydir+1)) { UPD(u,todst); } } } if (x == 0 || y == 0) { if (dir[u] == F4(mydir+2)) { UPD(u, todst); } } } } } int re = 0; REP(i,n) { if (dst[i] != inf) { bug(i, dst[i]); ++re; } } return re; } signed main(){ IOS(); cin>>n; REP(i,n) { P[i].in(); if (i) { P[i].x -= P[0].x; P[i].y -= P[0].y; } } P[0] = {0,0}; int re = 0; REP(idir, 4) { MX(re, run(idir)); } cout<<re<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...