제출 #1181199

#제출 시각아이디문제언어결과실행 시간메모리
1181199LucaIlieSprinklers (CEOI24_sprinklers)C++20
0 / 100
2096 ms8004 KiB
#include <bits/stdc++.h> using namespace std; struct range { int l, r; }; const int MAX_N = 1e5; const int MAX_D = 1e9; const int MIN_D = 0; int n, m; int s[MAX_N + 1], f[MAX_N + 1]; range rightReach[MAX_N + 1], leftReach[MAX_N + 1]; int dp[1001][1001]; char last[1001][1001]; bool solve( int d, bool printSol ) { int j = 1; for ( int i = 1; i <= n; i++ ) { while ( j <= m && f[j] < s[i] - d ) j++; leftReach[i].l = j; } j = 0; for ( int i = 1; i <= n; i++ ) { while ( j + 1 <= m && f[j + 1] <= s[i] + d ) j++; rightReach[i].r = j; } j = 0; for ( int i = 1; i <= n; i++ ) { while ( j + 1 <= m && f[j + 1] <= s[i] ) j++; leftReach[i].r = j; } j = 1; for ( int i = 1; i <= n; i++ ) { while ( j <= m && f[j] < s[i] ) j++; rightReach[i].l = j; } for ( int i = 0; i <= n; i++ ) { for ( int j = 0; j <= m; j++ ) dp[i][j] = (j == 0), last[i][j] = 'L'; } for ( int i = 1; i <= n; i++ ) { // i merge la stanga for ( int j = 0; j < m; j++ ) { //eu am acoperit pana la j deci acopar (j+1, leftReach[i].r) si eventual mai mult if ( !dp[i - 1][j] ) continue; if ( s[i] - f[j + 1] > d ) continue; int k = leftReach[i].r; if ( leftReach[i - 1].l <= j + 1 ) k = max( k, rightReach[i - 1].r ); dp[i][k] = true; last[i][k] = 'L'; } // i merge la dreapta for ( int j = 0; j < m; j++ ) { if ( !dp[i - 1][j] ) continue; int k = j; if ( rightReach[i].l <= j + 1 ) k = rightReach[i].r; dp[i][k] = true; last[i][k] = 'R'; } for ( int j = n - 1; j >= 0; j-- ) { dp[i][j] |= dp[i][j + 1]; if ( dp[i][j + 1] ) last[i][j] = last[i][j + 1]; } } j = m; string sol = ""; for ( int i = n; i >= 1; i-- ) { sol += last[i][j]; if ( last[i][j] == 'R' ) j = rightReach[i].l - 1; else j = leftReach[i].l - 1; j = max( 0, j ); } reverse( sol.begin(), sol.end() ); if ( printSol ) cout << sol << "\n"; #ifdef LOCAL printf( "---------D %d--------\n", d ); for ( int i = 1; i <= n; i++ ) { printf( "%d %d %d %d\n", leftReach[i].l, leftReach[i].r, rightReach[i].l, rightReach[i].r ); } for ( int i = 0; i <= n; i++ ) { for ( int j = 0; j <= m; j++ ) printf( "%d", dp[i][j] ); printf( "\n" ); } #endif return dp[n][m]; } int main() { cin.tie( nullptr ); ios_base::sync_with_stdio( false ); cin >> n >> m; for ( int i = 1; i <= n; i++ ) cin >> s[i]; for ( int i = 1; i <= m; i++ ) cin >> f[i]; int l = MIN_D - 1, r = MAX_D + 1; while ( r - l > 1 ) { int mid = (l + r) / 2; if ( solve( mid, false ) ) r = mid; else l = mid; } if ( r == MAX_D + 1 ) cout << "-1\n"; else { cout << r << "\n"; solve( r, true ); } return 0; }
#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...