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;
typedef long long ll;
typedef pair<int, int> pii;
#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N = (int)151111;
int dir[8][2] = {{-1,-1},{0,-1},{+1,-1},{+1,0},{+1,+1},{0,+1},{-1,+1},{-1,0}};
int adj[4][2] = {{-1,0},{+1,0},{0,-1},{0,+1}};
set<pii> graf;
map<pii, int> full;
map<pii, int> col;
int ci[N], cj[N];
priority_queue<int> cand;
set<pii> vso;
void check(pii cur){
vso.insert(cur);
pii nx;
for(int q =0 ; q < 8 ; q ++ ){
nx = mp(cur.fi+dir[q][0],cur.se+dir[q][1]);
if(!vso.count(nx) && full.count(nx)){
check(nx);
}
}
}
void add_outside(pii cur){
pii nx;
col[cur]=0;
for(int d = 0; d < 4; d ++ ){
nx = mp(cur.fi+adj[d][0],cur.se+adj[d][1]);
if(!graf.count(nx)) continue;
if(full.count(nx)){
cand.push(full[nx]);
}
else{
if(!col.count(nx) || col[nx] > 0){
add_outside(nx);
}
}
}
}
void fillc(pii cur, int cl){
pii nx;
col[cur]=cl;
for(int d = 0; d < 4; d ++ ){
nx = mp(cur.fi+adj[d][0],cur.se+adj[d][1]);
if(!graf.count(nx)) continue;
if(full.count(nx)) continue;
if(col.count(nx)) continue;
fillc(nx,cl);
}
}
bool is_valid(pii xx){
vector<int> q;
pii nx;
int cnt = 0;
for(int t = 0; t < 8 ; t ++ ){
nx = mp(xx.fi + dir[t][0], xx.se + dir[t][1]);
if(full.count(nx)){
cnt ++ ;
q.push_back(-1);
}
else{
q.push_back(col[nx]);
}
}
if(cnt <= 1) return true;
int pt, qt;
for(int t = 0 ; t < 8 ; t += 2){ // corner
pt = (t - 1 + 8) % 8;
qt = (t + 1) % 8;
if(q[t] == -1 && q[pt] >= 0 && q[pt] == q[qt]){
return false;
}
}
if(q[1] >= 0 && q[1] == q[5] && min({q[2],q[3],q[4]}) == -1 && min({q[0],q[6],q[7]}) == -1){
return false;
}
if(q[3] >= 0 && q[3] == q[7] && min({q[0],q[1],q[2]}) == -1 && min({q[4],q[5],q[6]}) == -1){
return false;
}
return true;
}
bool active[N];
int main(){
fastIO;
int n, tip;
cin >> n >> tip;
pii nx;
pii low = mp((int)1e9 + 7, (int)1e9 + 7);
for(int i = 1; i <= n; i ++ ){
cin >> ci[i] >> cj[i];
active[i]=true;
graf.insert(mp(ci[i],cj[i]));
full[mp(ci[i],cj[i])]=i;
for(int j = 0 ;j < 8; j ++ ){
nx = mp(ci[i]+dir[j][0],cj[i]+dir[j][1]);
low = min(low, nx);
graf.insert(nx);
}
}
check(mp(ci[1],cj[1]));
if(vso.size() != n){
cout << "NO\n";
return 0;
}
add_outside(low);
int cnt = 1;
for(auto v : graf){
if(full.count(v) || col.count(v)) continue;
fillc(v, cnt);
cnt ++ ;
}
int node;
vector<int> que;
int hi, wi;
for(int delet = 0; delet < n; delet ++ ){
while(!cand.empty()){
node = cand.top();
cand.pop();
if(!active[node]){
continue;
}
if(is_valid(mp(ci[node],cj[node]))){
active[node]=false;
que.push_back(node);
full.erase(mp(ci[node],cj[node]));
for(int t = 0; t < 4; t ++ ){
if(!full.count(mp(ci[node]+adj[t][0],cj[node]+adj[t][1]))){
col[mp(ci[node]+adj[t][0],cj[node]+adj[t][1])]=1;
}
}
add_outside(mp(ci[node],cj[node]));
break;
}
}
}
cout << "YES\n";
reverse(que.begin(), que.end());
for(auto x : que){
cout << x << " ";
}
cout << "\n";
return 0;
}
Compilation message (stderr)
skyscrapers.cpp: In function 'int main()':
skyscrapers.cpp:119:19: warning: comparison of integer expressions of different signedness: 'std::set<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
119 | if(vso.size() != n){
| ~~~~~~~~~~~^~~~
skyscrapers.cpp:132:9: warning: unused variable 'hi' [-Wunused-variable]
132 | int hi, wi;
| ^~
skyscrapers.cpp:132:13: warning: unused variable 'wi' [-Wunused-variable]
132 | int hi, wi;
| ^~
# | 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... |