Submission #436668

#TimeUsernameProblemLanguageResultExecution timeMemory
436668dqhungdlFountain Parks (IOI21_parks)C++17
70 / 100
925 ms81128 KiB
#include "parks.h" #include <bits/stdc++.h> using namespace std; typedef pair<int,int> ii; const int MAX=2e5+5; int n,P[MAX]; vector<int> x,y; map<ii,int> M; bool isVertical(ii u) { return x[u.first]==x[u.second]; } bool cmp(ii u,ii v) { if(x[u.first]==x[v.first]) { if(isVertical(u)==isVertical(v)) return y[u.first]<y[v.first]; return isVertical(u)>isVertical(v); } return x[u.first]<x[v.first]; } vector<ii> constructBenches(vector<ii> &paths) { map<ii,bool> mark; vector<ii> benchesPos; map<ii,vector<int>> g; for(int i=0;i<paths.size();i++) { ii path=paths[i]; if(x[path.first]==x[path.second]) { int bx=x[path.first],by=y[path.first]+1; benchesPos.push_back({bx-1,by}); benchesPos.push_back({bx+1,by}); g[ii(bx-1,by)].push_back(i); g[ii(bx+1,by)].push_back(i); } else { int bx=x[path.first]+1,by=y[path.first]; benchesPos.push_back({bx,by-1}); benchesPos.push_back({bx,by+1}); g[ii(bx,by-1)].push_back(i); g[ii(bx,by+1)].push_back(i); } } vector<ii> benches; if(*max_element(x.begin(),x.end())<=6) { for(int i=0;i<paths.size();i++) { if(!mark[benchesPos[2*i]]) { mark[benchesPos[2*i]]=true; benches.push_back(benchesPos[2*i]); } else { mark[benchesPos[2*i+1]]=true; benches.push_back(benchesPos[2*i+1]); } } } else { benches.resize(paths.size(),{-1,-1}); for(int i=0;i<paths.size();i++) if(benches[i]==ii(-1,-1)) { int curId=i; ii curBenchPos=benchesPos[2*i]; benches[curId]=curBenchPos; vector<int> gg=g[curBenchPos]; while(gg.size()==2) { int u=gg[0],v=gg[1]; if(u!=curId) swap(u,v); curId=v; if(benches[curId]!=ii(-1,-1)) break; curBenchPos=(curBenchPos!=benchesPos[2*v]?benchesPos[2*v]:benchesPos[2*v+1]); benches[curId]=curBenchPos; gg=g[curBenchPos]; } } for(ii bench:benches) { assert(!mark[bench]); mark[bench]=true; } } return benches; } int find(int u) { if(u==P[u]) return u; return P[u]=find(P[u]); } void merge(int u,int v) { if(u>v) swap(u,v); P[u]=v; } vector<ii> removePaths(vector<ii> paths) { for(int i=0;i<n;i++) P[i]=i; vector<ii> newPaths; for(ii path:paths) { int u=find(path.first),v=find(path.second); if(u!=v) { merge(u,v); newPaths.push_back(path); } } return newPaths; } int construct_roads(std::vector<int> _x, std::vector<int> _y) { n=_x.size(); x=_x,y=_y; for(int i=0;i<n;i++) M[ii(x[i],y[i])]=i; vector<ii> paths; for(int i=0;i<n;i++) { auto it=M.find({x[i]+2,y[i]}); if(it!=M.end()) paths.push_back({i,it->second}); it=M.find({x[i],y[i]+2}); if(it!=M.end()) paths.push_back({i,it->second}); } sort(paths.begin(),paths.end(),cmp); paths = removePaths(paths); if(paths.size()!=n-1) return 0; //for(ii path:paths) // cerr<<x[path.first]<<' '<<y[path.first]<<' '<<x[path.second]<<' '<<y[path.second]<<'\n'; vector<ii> benches=constructBenches(paths); vector<int> U(n-1),V(n-1),A(n-1),B(n-1); for(int i=0;i<n-1;i++) { U[i]=paths[i].first,V[i]=paths[i].second; A[i]=benches[i].first,B[i]=benches[i].second; } build(U,V,A,B); return 1; }

Compilation message (stderr)

parks.cpp: In function 'std::vector<std::pair<int, int> > constructBenches(std::vector<std::pair<int, int> >&)':
parks.cpp:29:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |  for(int i=0;i<paths.size();i++) {
      |              ~^~~~~~~~~~~~~
parks.cpp:47:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   47 |   for(int i=0;i<paths.size();i++) {
      |               ~^~~~~~~~~~~~~
parks.cpp:58:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |   for(int i=0;i<paths.size();i++)
      |               ~^~~~~~~~~~~~~
parks.cpp: In function 'int construct_roads(std::vector<int>, std::vector<int>)':
parks.cpp:126:17: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  126 |  if(paths.size()!=n-1)
      |     ~~~~~~~~~~~~^~~~~
#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...