Submission #435331

#TimeUsernameProblemLanguageResultExecution timeMemory
435331jangwonyoung분수 공원 (IOI21_parks)C++17
100 / 100
2982 ms123008 KiB
///////////////////////////// #include "parks.h" #include<bits/stdc++.h> using namespace std; #define n nnn typedef array<int,4> arin; const int N=2e5+1; int n; int cx[N],cy[N]; vector<arin>edges; vector<int>built[4]; int dx[4]={-2,0,2,0}; int dy[4]={0,-2,0,2}; int ex[4]={-1,1,1,-1}; int ey[4]={-1,-1,1,1}; int p[N]; int find(int x){ if(p[x]!=x) p[x]=find(p[x]); return p[x]; } bool join(int x,int y){ x=find(x);y=find(y); if(x==y) return false; p[x]=y; return true; } map<pair<int,int>,int>mp,sq; map<pair<int,int>,bool>used; map<pair<int,int>,bool>ban; vector<pair<int,pair<int,int> > >adj[N]; bool vis[N]; #define fi first #define se second void dfs(int id){ for(auto c:adj[id]){ if(!vis[c.fi]){ vis[c.fi]=true; ban[c.se]=true; dfs(c.fi); } } } vector<pair<pair<int,int>,int> >sqq; int construct_roads(vector<int>x,vector<int>y){ n=x.size(); for(int i=1; i<=n ;i++){ cx[i]=x[i-1]; cy[i]=y[i-1]; mp[{cx[i],cy[i]}]=i; p[i]=i; } int m=0; for(int i=1; i<=n ;i++){ if(!mp[{cx[i],cy[i]}]) continue; if(!mp[{cx[i]+2,cy[i]}]) continue; if(!mp[{cx[i],cy[i]+2}]) continue; if(!mp[{cx[i]+2,cy[i]+2}]) continue; sq[{cx[i]+1,cy[i]+1}]=++m; } typedef pair<int,int> pii; for(auto c:sq) sqq.push_back({c.fi,c.se}); for(auto c:sqq){ auto cur=c.fi; int c1=mp[(pii){cur.fi-1,cur.se-1}]; int c2=mp[(pii){cur.fi+1,cur.se-1}]; int c3=mp[(pii){cur.fi-1,cur.se+1}]; int c4=mp[(pii){cur.fi+1,cur.se+1}]; if((cur.fi+cur.se)%4==0){//horizontal int u=sq[{cur.fi-2,cur.se}]; int v=sq[{cur.fi+2,cur.se}]; adj[u].push_back({c.se,{c1,c3}}); adj[v].push_back({c.se,{c2,c4}}); } else{ int u=sq[{cur.fi,cur.se-2}]; int v=sq[{cur.fi,cur.se+2}]; adj[u].push_back({c.se,{c1,c2}}); adj[v].push_back({c.se,{c3,c4}}); } } dfs(0); for(int i=1; i<=n ;i++){ if((cx[i]+cy[i])%4!=0) continue; for(int j=0; j<4 ;j++){ int s=mp[{cx[i]+dx[j],cy[i]+dy[j]}]; if(s==0) continue; if(ban[{i,s}]==1 || ban[{s,i}]==1) continue; if(join(i,s)){ edges.push_back(arin{i-1,s-1,cx[i]+ex[j],cy[i]+ey[j]}); } } } if(edges.size()!=n-1) return 0; for(auto c:edges){ for(int j=0; j<4 ;j++){ built[j].push_back(c[j]); } } build(built[0],built[1],built[2],built[3]); return 1; } ////////////////////////////////////////////////////////////////////////

Compilation message (stderr)

parks.cpp: In function 'int construct_roads(std::vector<int>, std::vector<int>)':
parks.cpp:94:20: warning: comparison of integer expressions of different signedness: 'std::vector<std::array<int, 4> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   94 |     if(edges.size()!=n-1) return 0;
      |        ~~~~~~~~~~~~^~~~~
#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...