제출 #219031

#제출 시각아이디문제언어결과실행 시간메모리
219031Nightlight건물 4 (JOI20_building4)C++14
0 / 100
5 ms384 KiB
#include <bits/stdc++.h> using namespace std; int N; int fix[1000005][2]; //apakah fixed int to[1000005][2]; //menyimpan lokasi bridge terdekat (A ke B) dan (B ke A) int A[1000005][2]; //tinggi building int b[2]; //banyak yang diperlukan untuk setiap A B bool rc[1000005][2]; //dp pertama nyimpan semua path valid void DFS(int u, int i) { if(u == N) { rc[u][i] = 1; return; } if(rc[u][i]) return; if(A[u][i] <= A[u + 1][i]) { DFS(u + 1, i); rc[u][i] |= rc[u + 1][i]; } if(A[u][i] <= A[u + 1][!i]) { DFS(u + 1, !i); rc[u][i] |= rc[u + 1][!i]; } } int main() { // freopen("inp", "r", stdin); scanf("%d", &N); N <<= 1; for(int i = 1; i <= N; i++) { scanf("%d", &A[i][0]); } for(int i = 1; i <= N; i++) { scanf("%d", &A[i][1]); } A[N + 1][0] = 2e9, A[N + 1][1] = 2e9; DFS(1, 0); DFS(1, 1); if(!rc[1][0] && !rc[1][1]) { puts("-1"); return 0; } b[0] = N >> 1, b[1] = N >> 1; for(int i = 1; i <= N; i++) { if(rc[i][0] ^ rc[i][1]) { b[0] -= rc[i][0]; b[1] -= rc[i][1]; } if(A[i - 1][0] <= A[i][1] && rc[i - 1][0] && rc[i][1]) { to[i - 1][0] = i - 1; } if(A[i - 1][1] <= A[i][0] && rc[i - 1][1] && rc[i][0]) { to[i - 1][1] = i - 1; } } /* for(int i = 1; i <= N; i++) { cout << to[i][0] << " "; } puts(""); for(int i = 1; i <= N; i++) { cout << to[i][1] << " "; } puts("");*/ int mn[2]; for(int i = N; i > 0; i--) { if(rc[i][0]) { if(to[i][0]) mn[0] = to[i][0]; else to[i][0] = mn[0]; } //ada bridge baru A ke B if(rc[i][1]) { if(to[i][1]) mn[1] = to[i][1]; else to[i][1] = mn[1]; } //ada bridge baru B ke A } if((b[0] < 0) || (b[1] < 0)) { puts("-1"); return 0; } int last = 0; for(int i = 1; i <= N; i++) { if(rc[i][0] ^ rc[i][1]) { //kalau fixed putchar((rc[i][0] ? 'A' : 'B')); last = rc[i][1]; continue; } //greedy A duluan kalau A dah habis baru B semua if(last == 0) { if(to[i][0] - i + 1 <= b[0]) { //jika bridge (A ke B) terdekat dan posisi sekarang jaraknya kurang dari jumlah 'A' yang diperlukan maka ambil aja b[0]--; putchar('A'); }else { last = 1; b[1]--; putchar('B'); } }else if(last == 1) { if(to[i - 1][1] == i - 1 && to[i][0] - i + 1 <= b[0]) { //jika sebelumnya ada bridge (B ke A) dan jarak bridge (A ke B) dan (B ke A) terdekat kurang dari jumlah 'A' yang diperlukan b[0]--; putchar('A'); last = 0; }else { b[1]--; putchar('B'); } } } }

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

building4.cpp: In function 'int main()':
building4.cpp:35:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &N);
   ~~~~~^~~~~~~~~~
building4.cpp:38:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &A[i][0]);
     ~~~~~^~~~~~~~~~~~~~~~
building4.cpp:41:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &A[i][1]);
     ~~~~~^~~~~~~~~~~~~~~~
building4.cpp:80:21: warning: 'mn[1]' may be used uninitialized in this function [-Wmaybe-uninitialized]
       else to[i][1] = mn[1];
            ~~~~~~~~~^~~~~~~
building4.cpp:75:21: warning: 'mn[0]' may be used uninitialized in this function [-Wmaybe-uninitialized]
       else to[i][0] = mn[0];
            ~~~~~~~~~^~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...