제출 #237954

#제출 시각아이디문제언어결과실행 시간메모리
237954egekabas건물 4 (JOI20_building4)C++14
0 / 100
6 ms640 KiB
#include <bits/stdc++.h> #define ff first #define ss second #define pb push_back #define mp make_pair using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<ll, ll> pll; typedef pair<ull, ull> pull; typedef pair<int, int> pii; typedef pair<ld, ld> pld; pii a[1000009][2]; int n; const int inf = 1e9; char ans[1000009]; void change(int l, int r){ for(int i = 0; i <= l; ++i){ if(ans[i] == 'A') ans[i] = 'B'; else ans[i] = 'A'; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); cin >> n; n *= 2; for(int i = 0; i < n; ++i){ cin >> a[i][0].ff; a[i][0].ss = 1; } for(int i = 0; i < n; ++i){ cin >> a[i][1].ff; a[i][1].ss = -1; if(a[i][1].ff > a[i][0].ff){ swap(a[i][1], a[i][0]); } } vector<pair<vector<int>, vector<int>>> fv; int val[2] = {-inf, -inf}; vector<int> cur[2]; for(int i = 0; i < n; ++i){ if(a[i][0].ff < val[1]){ cout << "-1\n"; return 0; } else if(a[i][1].ff >= val[0] && val[0] != -1e9){ val[0] = -1e9; val[1] = -1e9; fv.pb({cur[0], cur[1]}); cur[0].clear(); cur[1].clear(); --i; } else if(a[i][1].ff >= val[1] && val[0] > a[i][1].ff && val[0] > a[i][0].ff){ cur[0] = cur[1]; cur[1].clear(); val[0] = -1e9; val[1] = -1e9; fv.pb({cur[0], cur[1]}); cur[0].clear(); --i; } else if(a[i][0].ff >= val[1] && val[0] > a[i][1].ff && val[0] > a[i][0].ff){ a[i][1] = a[i][0]; --i; } else{ val[0] = a[i][0].ff; val[1] = a[i][1].ff; cur[0].pb(a[i][0].ss); cur[1].pb(a[i][1].ss); } } if(!cur[0].empty()){ fv.pb({cur[0], cur[1]}); } int curid = 0; int curbal = 0; for(auto v : fv){ for(int i = 0; i < v.ff.size(); ++i){ curbal += v.ff[i]; if(v.ff[i] == 1) ans[curid+i] = 'A'; else ans[curid+i] = 'B'; } curid += v.ff.size(); } curid = 0; for(auto v : fv){ int curval = 0; pii mini = {1e9, 1e9}; pii maxi = {-1e9, -1e9}; for(int i = 0; i < v.ss.size(); ++i){ curval += v.ss[i] - v.ff[i]; if(curval == -curbal){ change(curid, curid+i); curbal = 0; break; } mini = min(mini, {curval, i}); maxi = max(maxi, {curval, i}); } if(curbal == 0) break; else if(curbal > 0 && mini.ff < 0){ curbal += mini.ff; change(curid, mini.ss+curid); } else if(curbal < 0 && maxi.ff > 0){ curbal += maxi.ff; change(curid, maxi.ss+curid); } curid += v.ff.size(); } if(curbal != 0){ cout << "-1\n"; return 0; } for(int i = 0; i < n; ++i) cout << ans[i]; }

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

building4.cpp: In function 'int main()':
building4.cpp:88:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < v.ff.size(); ++i){
                    ~~^~~~~~~~~~~~~
building4.cpp:102:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < v.ss.size(); ++i){
                    ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...