This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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() && !vis[{nx,ny}]){
++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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |