Submission #396431

#TimeUsernameProblemLanguageResultExecution timeMemory
396431arnold518IOI Fever (JOI21_fever)C++17
100 / 100
869 ms42184 KiB
#pragma GCC optimize ("O3") #pragma GCC optimize ("Ofast") #pragma GCC optimize ("unroll-loops") #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const int MAXN = 1e6; const int INF = 2147483647; struct Point { int x, y, p; }; int N; Point A[MAXN+10]; struct Queue { int u, d; int w; bool operator < (const Queue &p) const { return w>p.w; } }; int dist[MAXN+10]; int d(int u, int v) { return (abs(A[u].x-A[v].x)+abs(A[u].y-A[v].y)); } int ans; unordered_map<int, vector<int>> M1, M2, M3, M4; bool cmpx(int p, int q) { return A[p].x<A[q].x; } bool cmpy(int p, int q) { return A[p].y<A[q].y; } int norm(int x) { x%=N; if(x==0) x=N; return x; } int main() { scanf("%d", &N); for(int i=1; i<=N; i++) { scanf("%d%d", &A[i].x, &A[i].y); A[i].x*=2; A[i].y*=2; A[i].p=i; } for(int i=1; i<=N; i++) { M1[A[i].x-A[i].y].push_back(i); M2[A[i].x+A[i].y].push_back(i); M3[A[i].x].push_back(i); M4[A[i].y].push_back(i); } for(auto &it : M1) { sort(it.second.begin(), it.second.end(), cmpx); } for(auto &it : M2) { sort(it.second.begin(), it.second.end(), cmpy); } for(auto &it : M3) { sort(it.second.begin(), it.second.end(), cmpy); } for(auto &it : M4) { sort(it.second.begin(), it.second.end(), cmpx); } priority_queue<Queue> PQ; for(int p=0; p<4; p++) { for(int i=1; i<=N*9; i++) dist[i]=INF; PQ.push({1, p, 0}); while(!PQ.empty()) { Queue now=PQ.top(); PQ.pop(); if(dist[now.u]<=now.w) continue; dist[now.u]=now.w; //printf("%d %d : %d\n", now.u, now.d, now.w); int u=norm(now.u); auto &V1=M1[A[u].x-A[u].y]; auto &V2=M2[A[u].x+A[u].y]; auto &V3=M3[A[u].x]; auto &V4=M4[A[u].y]; if(now.u<=N) { if(now.d==0) { { A[0].x=A[now.u].x+now.w/2; auto it=upper_bound(V1.begin(), V1.end(), 0, cmpx); if(it!=V1.end()) { PQ.push({*it+N*1, 3, d(now.u, *it)}); } } { A[0].y=A[now.u].y+now.w/2; auto it=upper_bound(V2.begin(), V2.end(), 0, cmpy); if(it!=V2.end()) { PQ.push({*it+N*2, 1, d(now.u, *it)}); } } { A[0].y=A[now.u].y+now.w; auto it=upper_bound(V3.begin(), V3.end(), 0, cmpy); if(it!=V3.end()) { PQ.push({*it+N*3, 2, d(now.u, *it)}); } } } if(now.d==3) { { A[0].y=A[now.u].y+now.w/2; auto it=upper_bound(V2.begin(), V2.end(), 0, cmpy); if(it!=V2.end()) { PQ.push({*it+N*2, 2, d(now.u, *it)}); } } { A[0].x=A[now.u].x-now.w/2; auto it=lower_bound(V1.begin(), V1.end(), 0, cmpx); if(it!=V1.begin()) { it--; PQ.push({*it+N*5, 0, d(now.u, *it)}); } } { A[0].x=A[now.u].x-now.w; auto it=lower_bound(V4.begin(), V4.end(), 0, cmpx); if(it!=V4.begin()) { it--; PQ.push({*it+N*8, 1, d(now.u, *it)}); } } } if(now.d==2) { { A[0].x=A[now.u].x-now.w/2; auto it=lower_bound(V1.begin(), V1.end(), 0, cmpx); if(it!=V1.begin()) { it--; PQ.push({*it+N*5, 1, d(now.u, *it)}); } } { A[0].y=A[now.u].y-now.w/2; auto it=lower_bound(V2.begin(), V2.end(), 0, cmpy); if(it!=V2.begin()) { it--; PQ.push({*it+N*6, 3, d(now.u, *it)}); } } { A[0].y=A[now.u].y-now.w; auto it=lower_bound(V3.begin(), V3.end(), 0, cmpy); if(it!=V3.begin()) { it--; PQ.push({*it+N*7, 0, d(now.u, *it)}); } } } if(now.d==1) { { A[0].y=A[now.u].y-now.w/2; auto it=lower_bound(V2.begin(), V2.end(), 0, cmpy); if(it!=V2.begin()) { it--; PQ.push({*it+N*6, 0, d(now.u, *it)}); } } { A[0].x=A[now.u].x+now.w/2; auto it=upper_bound(V1.begin(), V1.end(), 0, cmpx); if(it!=V1.end()) { PQ.push({*it+N*1, 2, d(now.u, *it)}); } } { A[0].x=A[now.u].x+now.w; auto it=upper_bound(V4.begin(), V4.end(), 0, cmpx); if(it!=V4.end()) { PQ.push({*it+N*4, 3, d(now.u, *it)}); } } } } else if(now.u<=N*2) { PQ.push({u, now.d, now.w}); auto it=lower_bound(V1.begin(), V1.end(), u, cmpx); it++; if(it!=V1.end()) { PQ.push({*it+N, now.d, now.w+d(u, *it)}); } } else if(now.u<=N*3) { PQ.push({u, now.d, now.w}); auto it=lower_bound(V2.begin(), V2.end(), u, cmpy); it++; if(it!=V2.end()) { PQ.push({*it+N*2, now.d, now.w+d(u, *it)}); } } else if(now.u<=N*4) { //printf("%d %d %d\n", u, now.d, now.w); PQ.push({u, now.d, now.w}); auto it=lower_bound(V3.begin(), V3.end(), u, cmpy); it++; if(it!=V3.end()) { PQ.push({*it+N*3, now.d, now.w+d(u, *it)}); } } else if(now.u<=N*5) { PQ.push({u, now.d, now.w}); auto it=lower_bound(V4.begin(), V4.end(), u, cmpx); it++; if(it!=V4.end()) { PQ.push({*it+N*4, now.d, now.w+d(u, *it)}); } } else if(now.u<=N*6) { PQ.push({u, now.d, now.w}); auto it=lower_bound(V1.begin(), V1.end(), u, cmpx); if(it!=V1.begin()) { it--; PQ.push({*it+N*5, now.d, now.w+d(u, *it)}); } } else if(now.u<=N*7) { PQ.push({u, now.d, now.w}); auto it=lower_bound(V2.begin(), V2.end(), u, cmpy); if(it!=V2.begin()) { it--; PQ.push({*it+N*6, now.d, now.w+d(u, *it)}); } } else if(now.u<=N*8) { PQ.push({u, now.d, now.w}); auto it=lower_bound(V3.begin(), V3.end(), u, cmpy); if(it!=V3.begin()) { it--; PQ.push({*it+N*7, now.d, now.w+d(u, *it)}); } } else if(now.u<=N*9) { PQ.push({u, now.d, now.w}); auto it=lower_bound(V4.begin(), V4.end(), u, cmpx); if(it!=V4.begin()) { it--; PQ.push({*it+N*8, now.d, now.w+d(u, *it)}); } } } int cnt=0; for(int i=1; i<=N; i++) { if(dist[i]!=INF) cnt++; //printf("%d ", dist[i]); } //printf("%d\n", cnt); ans=max(ans, cnt); } printf("%d\n", ans); }

Compilation message (stderr)

fever.cpp: In function 'int main()':
fever.cpp:62:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   62 |  scanf("%d", &N);
      |  ~~~~~^~~~~~~~~~
fever.cpp:65:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   65 |   scanf("%d%d", &A[i].x, &A[i].y);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#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...