제출 #259717

#제출 시각아이디문제언어결과실행 시간메모리
259717MarcoMeijerBuilding Skyscrapers (CEOI19_skyscrapers)C++14
0 / 100
868 ms15268 KiB
#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"); } }

컴파일 시 표준 에러 (stderr) 메시지

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 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...