제출 #1302368

#제출 시각아이디문제언어결과실행 시간메모리
1302368clue_Towers (NOI22_towers)C++20
23 / 100
293 ms93472 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pp pair <int, int> #define fi first #define se second #define yes cout << "YES\n" #define no cout << "NO\n" const int N = 1e6 + 9; const int mod = 1e9 + 7; const int INF = 1e18 + 9; void add (int &a, int b){ a += b; if (a >= mod) a -= mod; } void sub (int &a, int b){ a -= b; if (a < 0) a += mod; } int n; struct point { int x; int y; int idx; } pts[N]; int res[N]; vector <int> grpX[N], grpY[N]; int cntRow[N], cntCol[N]; namespace sub1 { bool check (int mask){ int mx = 0; for (int i = 1; i <= n; i++) if (mask >> (i - 1) & 1){ cntRow[pts[i].x]++; cntCol[pts[i].y]++; mx = max ({mx, cntRow[pts[i].x], cntCol[pts[i].y]}); } for (int i = 1; i <= n; i++){ cntRow[pts[i].x] = 0; cntCol[pts[i].y] = 0; } if (mx > 2){ for (int i = 1; i <= n; i++){ cntRow[pts[i].x] = 0; cntCol[pts[i].y] = 0; } return 0; } for (int i = 1; i <= n; i++){ if (mask >> (i - 1) & 1) continue; int onL = 0, onR = 0; for (int idx : grpX[pts[i].x]){ if ((mask >> (idx - 1) & 1) ^ 1) continue; if (pts[idx].y < pts[i].y) onL = 1; if (pts[idx].y > pts[i].y) onR = 1; } if (onL && onR) continue; onL = 0; onR = 0; for (int idx : grpY[pts[i].y]){ if ((mask >> (idx - 1) & 1) ^ 1) continue; if (pts[idx].x < pts[i].x) onL = 1; if (pts[idx].x > pts[i].x) onR = 1; } if (onL && onR) continue; return 0; } return 1; } void solve (){ for (int mask = 0; mask < (1 << n); mask++){ if (check (mask)){ for (int i = 0; i < n; i++) cout << (mask >> i & 1); exit (0); } } exit (0); } } namespace sub2 { bool valid (){ for (int i = 1; i <= n; i++) if (grpX[pts[i].x].size () > 2) return 0; return 1; } void solve (){ vector <int> res (n, 0); for (int i = 1; i <= 1000000; i++){ if (grpY[i].empty ()) continue; res[grpY[i][0] - 1] = 1; res[grpY[i].back () - 1] = 1; } for (int i : res) cout << i; exit (0); } } int Ly[N], Ry[N]; bool needFill (int x){ for (int i : grpX[x]){ int y = pts[i].y; if (Ly[y] == -1 || Ry[y] == -1) return 1; if (Ly[y] < x && x < Ry[y]){ } else return 1; } return 0; } void upd (int y, int x){ if (Ly[y] == -1 || Ly[y] > x) Ly[y] = x; if (Ry[y] == -1 || Ry[y] < x) Ry[y] = x; } void solve (){ cin >> n; for (int i = 1; i <= n; i++){ cin >> pts[i].x >> pts[i].y; pts[i].idx = i; } for (int i = 1; i <= n; i++){ grpX[pts[i].x].push_back (pts[i].idx); grpY[pts[i].y].push_back (pts[i].idx); } if (sub2::valid ()) sub2::solve (); if (n <= 16) sub1::solve (); for (int i = 1; i <= 1000000; i++) Ly[i] = Ry[i] = -1; for (int i = 1; i <= 1000000; i++) sort (grpX[i].begin (), grpX[i].end (), [&](int z1, int z2){ return pts[z1].y < pts[z2].y; }); vector <int> res (n, 0); int L = 1, R = 1000000; while (1){ while (L <= R && needFill (L) == 0) L++; if (L > R) break; while (L <= R && needFill (R) == 0) R--; if (L > R) break; // int stL = 0, enL = 0; for (int i : grpX[L]){ int y = pts[i].y; if (Ly[y] == -1 || Ry[y] == -1){ stL = i; break; } if (Ly[y] < L && L < Ry[y]){ } else { stL = i; break; } } for (int i = grpX[L].size () - 1; i >= 0; i--){ int y = pts[grpX[L][i]].y; if (Ly[y] == -1 || Ry[y] == -1){ enL = grpX[L][i]; break; } if (Ly[y] < L && L < Ry[y]){ } else { enL = grpX[L][i]; break; } } res[pts[stL].idx - 1] = res[pts[enL].idx - 1] = 1; upd (pts[stL].y, pts[stL].x); upd (pts[enL].y, pts[enL].x); // phase 2 int stR = 0, enR = 0; for (int i : grpX[R]){ int y = pts[i].y; if (Ly[y] == -1 || Ry[y] == -1){ stR = i; break; } if (Ly[y] < R && R < Ry[y]){ } else { stR = i; break; } } for (int i = grpX[R].size () - 1; i >= 0; i--){ int y = pts[grpX[R][i]].y; if (Ly[y] == -1 || Ry[y] == -1){ enR = grpX[R][i]; break; } if (Ly[y] < R && R < Ry[y]){ } else { enR = grpX[R][i]; break; } } res[pts[stR].idx - 1] = res[pts[enR].idx - 1] = 1; upd (pts[stR].y, pts[stR].x); upd (pts[enR].y, pts[enR].x); L++; R--; } for (int i : res) cout << i; } bool END; void reset (){ } signed main (){ ios_base::sync_with_stdio (false); cin.tie (NULL); cout.tie (NULL); if (fopen ("slamp.inp", "r")){ freopen ("slamp.inp", "r", stdin); freopen ("slamp.out", "w", stdout); } int t = 1; // cin >> t; while (t--){ solve (); reset (); } } // <33

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

Main.cpp: In function 'int main()':
Main.cpp:208:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  208 |         freopen ("slamp.inp", "r", stdin);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:209:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  209 |         freopen ("slamp.out", "w", stdout);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#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...