Submission #259717

# Submission time Handle Problem Language Result Execution time Memory
259717 2020-08-08T11:53:06 Z MarcoMeijer Building Skyscrapers (CEOI19_skyscrapers) C++14
0 / 100
868 ms 15268 KB
#include <bits/stdc++.h>
using namespace std;

// macros
typedef long long ll;
typedef long double ld;
typedef pair<int, int> ii;
typedef pair<ll, ll> lll;
typedef tuple<int, int, int> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<ll> vll;
typedef vector<lll> vlll;
#define REP(a,b,c) for(int a=int(b); a<int(c); a++)
#define RE(a,c) REP(a,0,c)
#define RE1(a,c) REP(a,1,c+1)
#define REI(a,b,c) REP(a,b,c+1)
#define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--)
#define FOR(a,b) for(auto& a : b)
#define all(a) a.begin(), a.end()
#define INF 1e9
#define EPS 1e-9
#define pb push_back
#define popb pop_back
#define fi first
#define se second
#define sz size()

// input
template<class T> void IN(T& x) {cin >> x;}
template<class H, class... T> void IN(H& h, T&... t) {IN(h); IN(t...); }

// output
template<class T1, class T2> void OUT(const pair<T1,T2>& x);
template<class T> void OUT(const T& x) {cout << x;}
template<class H, class... T> void OUT(const H& h, const T&... t) {OUT(h); OUT(t...); }
template<class T1, class T2> void OUT(const pair<T1,T2>& x) {OUT(x.fi," ",x.se);}
template<class... T> void OUTL(const T&... t) {OUT(t..., "\n"); }

//===================//
//  Added libraries  //
//===================//

//===================//
//end added libraries//
//===================//

void program();
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    program();
}


//===================//
//   begin program   //
//===================//

const int MX = 5e5;

int dx4[]={-1,0,1,0};
int dy4[]={0,1,0,-1};
int dx8[]={ 0, 1, 1, 1, 0,-1,-1,-1};
int dy8[]={ 1, 1, 0,-1,-1,-1, 0, 1};

int n, t;
int R[MX], C[MX];
bitset<MX> visited;
map<ii,int> f;
set<ii> build;
set<ii> emp;
set<int> pq;
vi ans;

bool canDestroy(ii p) {
    int x=p.fi, y=p.se;
    bool foundEmpty=0;
    RE(d,4) {
        int nx=x+dx4[d];
        int ny=y+dy4[d];
        if(emp.count({nx,ny})) {
            foundEmpty=1;
            break;
        }
    }
    if(!foundEmpty) return 0;

    int start=0;
    bool isBuild[8];
    RE(d,8) {
        int nx=x+dx8[d];
        int ny=y+dy8[d];
        isBuild[d] = build.count({nx,ny});
        if(isBuild[d]) start = d;
    }
    RE(d,4) {
        int cd=d*2;
        int nd=(cd+2)%8;
        if(isBuild[cd] && isBuild[nd])
            isBuild[(cd+1)%8]=1;
    }

    bool last=0;
    int pos=(start+1)%8, regions=0;
    while(pos!=start) {
        int nx=x+dx8[pos];
        int ny=y+dy8[pos];
        bool cur=(!emp.count({nx,ny})&&!isBuild[pos]);
        if(cur && !last) regions++;
        last = cur;
        pos=(pos+1)%8;
    }

    if(regions <= 1) return 1;
    return 0;
}
void updateBuild(ii p) {
    if(canDestroy(p)) pq.insert(f[p]);
    else pq.erase(f[p]);
}
void addEmpty(ii p) {
    if(emp.count(p)) return;
    bool foundBuild=0;
    int x=p.fi, y=p.se;
    RE(d,8) {
        int nx=x+dx8[d];
        int ny=y+dy8[d];
        if(build.count({nx,ny})) {
            foundBuild=1;
            break;
        }
    }
    if(!foundBuild) return;

    emp.insert(p);
    RE(d,4) {
        int nx=x+dx4[d];
        int ny=y+dy4[d];
        if(!build.count({nx,ny}))
            addEmpty({nx,ny});
    }
    RE(d,8) {
        int nx=x+dx8[d];
        int ny=y+dy8[d];
        if(build.count({nx,ny}))
            updateBuild({nx,ny});
    }
}

void dfsPossible(ii p) {
    if(!build.count(p)) return;
    if(visited[f[p]]) return;
    visited[f[p]] = 1;
    int x=p.fi, y=p.se;
    RE(d,8) {
        int nx=x+dx8[d];
        int ny=y+dy8[d];
        dfsPossible({nx,ny});
    }
}
bool isPossible() {
    dfsPossible({R[1],C[1]});
    RE1(i,n) if(!visited[i]) return 0;
    return 1;
}

void program() {
    IN(n,t);
    RE1(i,n) IN(R[i],C[i]);
    RE1(i,n) build.insert({R[i],C[i]});
    RE1(i,n) f[{R[i],C[i]}]=i;

    visited.reset();
    if(isPossible()) {
        ii start = *build.begin();
        start.fi--;
        addEmpty(start);
    }

    while(!pq.empty()) {
        int p = *(--pq.end());
        pq.erase(p);
        build.erase({R[p],C[p]});
        addEmpty({R[p],C[p]});
        ans.pb(p);
    }

    if(ans.sz == n) {
        OUTL("YES");
        reverse(all(ans));
        FOR(i,ans) OUTL(i);
    } else {
        OUTL("NO");
    }
}

Compilation message

skyscrapers.cpp: In function 'void program()':
skyscrapers.cpp:191:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(ans.sz == n) {
        ~~~~~~~^~~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 384 KB ans=YES N=1
2 Correct 0 ms 384 KB ans=YES N=4
3 Correct 0 ms 384 KB ans=NO N=4
4 Correct 0 ms 384 KB ans=YES N=5
5 Correct 0 ms 384 KB ans=YES N=9
6 Correct 1 ms 384 KB ans=YES N=5
7 Correct 0 ms 384 KB ans=NO N=9
8 Correct 0 ms 384 KB ans=NO N=10
9 Incorrect 1 ms 384 KB Full cells must be connected
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 384 KB ans=YES N=1
2 Correct 0 ms 384 KB ans=YES N=4
3 Correct 0 ms 384 KB ans=NO N=4
4 Correct 0 ms 384 KB ans=YES N=5
5 Correct 0 ms 384 KB ans=YES N=9
6 Correct 1 ms 384 KB ans=YES N=5
7 Correct 0 ms 384 KB ans=NO N=9
8 Correct 0 ms 384 KB ans=NO N=10
9 Incorrect 1 ms 384 KB Full cells must be connected
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 384 KB ans=YES N=1
2 Correct 0 ms 384 KB ans=YES N=4
3 Correct 0 ms 384 KB ans=NO N=4
4 Correct 0 ms 384 KB ans=YES N=5
5 Correct 0 ms 384 KB ans=YES N=9
6 Correct 1 ms 384 KB ans=YES N=5
7 Correct 0 ms 384 KB ans=NO N=9
8 Correct 0 ms 384 KB ans=NO N=10
9 Incorrect 1 ms 384 KB Full cells must be connected
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 672 KB ans=NO N=1934
2 Correct 2 ms 640 KB ans=NO N=1965
3 Incorrect 15 ms 768 KB Full cells must be connected
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 384 KB ans=YES N=1
2 Correct 0 ms 384 KB ans=YES N=4
3 Correct 0 ms 384 KB ans=NO N=4
4 Correct 0 ms 384 KB ans=YES N=5
5 Correct 0 ms 384 KB ans=YES N=9
6 Correct 1 ms 384 KB ans=YES N=5
7 Correct 0 ms 384 KB ans=NO N=9
8 Correct 0 ms 384 KB ans=NO N=10
9 Incorrect 1 ms 384 KB Full cells must be connected
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 197 ms 11624 KB ans=NO N=66151
2 Correct 60 ms 8568 KB ans=NO N=64333
3 Incorrect 868 ms 15268 KB Full cells must be connected
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 672 KB ans=NO N=1934
2 Correct 2 ms 640 KB ans=NO N=1965
3 Incorrect 15 ms 768 KB Full cells must be connected
4 Halted 0 ms 0 KB -