Submission #1072770

#TimeUsernameProblemLanguageResultExecution timeMemory
1072770kymBuilding Skyscrapers (CEOI19_skyscrapers)C++14
0 / 100
3586 ms25332 KiB
#include <bits/stdc++.h> using namespace std; #define int long long typedef pair<int,int>pi; const int oo = 1'000'000'000'000'000'000ll; int dx[]={0,1,1,1,0,-1,-1,-1}; int dy[]={1,1,0,-1,-1,-1,0,1}; vector<int>ord; vector<int>cur; map<pi,int>have; map<pi,int>idx; map<pi,int>vis; map<int,pi>coord; void dfs(pi cc){ vis[cc]=1; cur.push_back(idx[cc]); int x=cc.first,y=cc.second; for(int k=0;k<8;k++){ int nx=x+dx[k]; int ny=y+dy[k]; if(have.find({nx,ny}) != have.end() && !vis[{nx,ny}]){ dfs({nx,ny}); return; } } } vector<int>boundary(set<pi> S){//we must exclude the articulation points also vector<pi> X; for(auto x:S)X.push_back(x); sort(X.begin(),X.end(),[](pi x, pi y){ if(x.first != y.first)return x.first<y.first; else return x.second>y.second; }); have.clear(); cur.clear(); for(auto x:X)have[x]=1; vis.clear(); dfs(X[0]); //now check if it's a cycle or not // it is a cycle iff for the boundary nodes each node has >=2 neighbours if(cur.size() != have.size()) return cur; // must be a cyc, so removing any works //everyone is on the boundary, so check if line or cyc vector<int>ends; for(auto zz:cur){ int cnt=0; pi cc=coord[zz]; int x=cc.first,y=cc.second; for(int k=0;k<8;k++){ int nx=x+dx[k]; int ny=y+dy[k]; if(have.find({nx,ny}) != have.end()){ ++cnt; } } assert(cnt!=0); if(cnt==1){ ends.push_back(x); } } if(ends.empty())return cur; else return ends; } set<pi>ss; pi mn=make_pair(oo,oo); map<pi,bool>done; int n,t; void test(){ priority_queue<pi,vector<pi>,greater<pi>>pq; vector<int>ord; pq.push(mn); done[mn]=1; while(pq.size()){ pi cur=pq.top();pq.pop(); int x=cur.first,y=cur.second; ord.push_back(idx[{x,y}]); for(int k=0;k<8;k++){ int nx=x+dx[k],ny=y+dy[k]; if(idx.find({nx,ny}) != idx.end() && !done[{nx,ny}]){ done[{nx,ny}]=1; pq.push({nx,ny}); } } } if(ord.size() != n){ cout<<"NO\n";exit(0); } done.clear(); } int32_t main(){ cin>>n>>t; for(int i=1;i<=n;i++){ int x,y;cin>>x>>y; coord[i]={x,y}; idx[{x,y}]=i; ss.insert({x,y}); mn=min(mn,make_pair(x,y)); } test(); while(ord.size()<n){ vector<int>R=boundary(ss); int mx=0; for(auto x:R)mx=max(mx,x); ss.erase(coord[mx]); ord.push_back(mx); } reverse(ord.begin(),ord.end()); cout<<"YES\n"; for(auto x:ord)cout<<x<<"\n"; }

Compilation message (stderr)

skyscrapers.cpp: In function 'void test()':
skyscrapers.cpp:87:16: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
   87 |  if(ord.size() != n){
      |     ~~~~~~~~~~~^~~~
skyscrapers.cpp: In function 'int32_t main()':
skyscrapers.cpp:102:18: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
  102 |  while(ord.size()<n){
      |        ~~~~~~~~~~^~
#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...