제출 #1275026

#제출 시각아이디문제언어결과실행 시간메모리
1275026KluydQ벽 (IOI14_wall)C++20
100 / 100
711 ms140672 KiB
#include "wall.h" #include <bits/stdc++.h> //#define respagold ios_base::sync_with_stdio(0), cin.tie(0); //#define int long long #define ll long long #define int2 __int128_t #define FOR( i, x, n, d ) for( int i = x; i <= n; i += d ) #define FORR( i, x, n, d ) for( int i = x; i >= n; i -= d ) #define F first #define S second #define all(x) x.begin(), x.end() #define sz(x) (int)(x.size()) #define pb push_back #define pf push_front #define ins insert #define lb lower_bound #define ub upper_bound #define pii pair <int, int> #define ppi pair <pair <int, int>, int> #define pip pair <int, pair <int, int>> #define mkp make_pair using namespace std; const int N = 2e6 + 12; const int inf = 2e9; const int mod = 1e9 + 7; const double eps = 1e-20; int n, m, x, y, a[N], ans[N]; struct node { int mx1, mx2, mxc, mn1, mn2, mnc; }; node t[4 * N]; node merge( node a, node b ) { node res; int x1 = a.mx1, x2 = a.mx2, x3 = b.mx1, x4 = b.mx2; if( x1 > x3 ) res.mx1 = x1, res.mxc = a.mxc, res.mx2 = max( x2, x3 ); else if( x1 < x3 ) res.mx1 = x3, res.mxc = b.mxc, res.mx2 = max( x1, x4 ); else res.mx1 = x1, res.mx2 = max(x2, x4), res.mxc = a.mxc + b.mxc; x1 = a.mn1, x2 = a.mn2, x3 = b.mn1, x4 = b.mn2; if( x1 < x3 ) res.mn1 = x1, res.mnc = a.mnc, res.mn2 = min( x2, x3 ); else if( x1 > x3 ) res.mn1 = x3, res.mnc = b.mnc, res.mn2 = min( x1, x4 ); else res.mn1 = x1, res.mn2 = min(x2, x4), res.mnc = a.mnc + b.mnc; return res; } void build( int v = 1, int tl = 1, int tr = n ) { if( tl == tr ) { t[v].mx2 = -inf, t[v].mn2 = inf; t[v].mx1 = t[v].mn1 = a[tl]; t[v].mxc = t[v].mnc = 1; return; } int tm = tl + tr >> 1; build( v + v, tl, tm ); build( v + v + 1, tm + 1, tr ); t[v] = merge(t[v + v], t[v + v + 1]); } void pushmax( int v, int tl, int tr, int x ) { if( x >= t[v].mx1 ) return; if( t[v].mn1 == t[v].mx1 ) t[v].mn1 = x; if( t[v].mn2 == t[v].mx1 ) t[v].mn2 = x; t[v].mx1 = x; } void pushmin( int v, int tl, int tr, int x ) { if( x <= t[v].mn1 ) return; if( t[v].mx1 == t[v].mn1 ) t[v].mx1 = x; if( t[v].mx2 == t[v].mn1 ) t[v].mx2 = x; t[v].mn1 = x; } void pushdown( int v, int tl, int tr ) { if( tl == tr ) return; int tm = tl + tr >> 1; pushmax(v + v, tl, tm, t[v].mx1); pushmax(v + v + 1, tm + 1, tr, t[v].mx1); pushmin(v + v, tl, tm, t[v].mn1); pushmin(v + v + 1, tm + 1, tr, t[v].mn1); } void update_min( int l, int r, int x, int v = 1, int tl = 1, int tr = n ) { if( tl > r || l > tr || x >= t[v].mx1 ) return; if( l <= tl && tr <= r && x > t[v].mx2 ) {pushmax(v, tl, tr, x); return;} int tm = tl + tr >> 1; pushdown(v, tl, tr); update_min(l, r, x, v + v, tl, tm); update_min(l, r, x, v + v + 1, tm + 1, tr); t[v] = merge(t[v + v], t[v + v + 1]); } void update_max( int l, int r, int x, int v = 1, int tl = 1, int tr = n ) { if( tl > r || l > tr || x <= t[v].mn1 ) return; if( l <= tl && tr <= r && x < t[v].mn2 ) {pushmin(v, tl, tr, x); return;} int tm = tl + tr >> 1; pushdown(v, tl, tr); update_max(l, r, x, v + v, tl, tm); update_max(l, r, x, v + v + 1, tm + 1, tr); t[v] = merge(t[v + v], t[v + v + 1]); } void get( int v = 1, int tl = 1, int tr = n ) { pushdown(v, tl, tr); if( tl == tr ) { ans[tl] = t[v].mx1; return; } int tm = tl + tr >> 1; get(v + v, tl, tm); get(v + v + 1, tm + 1, tr); } void buildWall( int N, int M, int op[], int left[], int right[], int height[], int finalHeight[] ) { n = N, m = M; FOR( i, 1, n, 1 ) a[i] = 0; build(); FOR( i, 0, m - 1, 1 ) { int tp = op[i], l = left[i], r = right[i]; x = height[i]; if( tp == 1 ) update_max(l + 1, r + 1, x); if( tp == 2 ) update_min(l + 1, r + 1, x); } get(); FOR( i, 0, n - 1, 1 ) finalHeight[i] = ans[i + 1]; }/* signed main() { respagold int test = 1; if( !test ) cin >> test; while( test -- ) solve(); }*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...