답안 #639954

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
639954 2022-09-12T19:35:08 Z vladislav11 사탕 분배 (IOI21_candies) C++17
0 / 100
193 ms 106784 KB
#include "candies.h"

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

struct SegTree
{
    vector<ll> tree, padd, righ, mini, maxi;
    
    void init ( int s )
    {
        tree = padd = righ = mini = maxi = vector<ll>( 4*s, 0 );
    }
    
    void ppush ( int v, int tl, int tr )
    {
        tree[v] += (tr-tl+1)*padd[v];
        righ[v] += padd[v];
        mini[v] += padd[v];
        maxi[v] += padd[v];
        
        if ( tl != tr )
        {
            padd[2*v] += padd[v];
            padd[2*v+1] += padd[v];
        }
        
        padd[v] = 0;
    }
    
    void upd ( int v )
    {
        tree[v] = tree[2*v] + tree[2*v+1];
        righ[v] = righ[2*v+1];
        mini[v] = min( mini[2*v], mini[2*v+1] );
        maxi[v] = max( maxi[2*v], maxi[2*v+1] );
    }
    
    void tadd ( int v, int tl, int tr, int l, int r, int x )
    {
        ppush( v, tl, tr );
        
        if ( tr < l || r < tl )
            return;
        
        if ( l <= tl && tr <= r )
        {
            padd[v] += x;
            ppush( v, tl, tr );
            return;
        }
        
        int mid = ( tl + tr ) / 2;
        
        tadd( 2*v, tl, mid, l, r, x );
        tadd( 2*v+1, mid+1, tr, l, r, x );
        
        upd(v);
    }
    
    int fnd ( int v, int tl, int tr, int x, ll cmin, ll cmax )
    {
        ppush( v, tl, tr );
        
        if ( max( maxi[v], cmax ) - min( mini[v], cmin ) <= x )
            return tl;
        
        int mid = ( tl + tr ) / 2;
        
        if ( max( maxi[2*v+1], cmax ) - min( mini[2*v+1], cmin ) > x )
            return fnd( 2*v+1, mid+1, tr, x, cmin, cmax );
        
        if ( max({ maxi[2*v+1], righ[2*v], cmax }) - min({ mini[2*v+1], righ[2*v], cmin }) <= x )
            return fnd( 2*v, tl, mid, x, min( cmin, mini[2*v+1] ), max( cmax, maxi[2*v+1] ) );
        
        return fnd( 2*v+1, mid+1, tr, x, cmin, cmax );
    }
    
    ll tget ( int v, int tl, int tr, int pos )
    {
        ppush( v, tl, tr );
        
        if ( tl == tr )
            return tree[v];
        
        int mid = ( tl + tr ) / 2;
        
        if ( pos <= mid )
            return tget( 2*v, tl, mid, pos );
        
        return tget( 2*v+1, mid+1, tr, pos );
    }
    
    ll tfnc ( int v, int tl, int tr, int l, int r, bool bmin )
    {
        ppush( v, tl, tr );
        
        if ( tr < l || r < tl )
            return bmin ? 1e18 : -1e18;
        
        if ( l <= tl && tr <= r )
            return bmin ? mini[v] : maxi[v];
        
        int mid = ( tl + tr ) / 2;
        
        if ( bmin )
            return min( tfnc( 2*v, tl, mid, l, r, true ), tfnc( 2*v+1, mid+1, tr, l, r, true ) );
        
        return max( tfnc( 2*v, tl, mid, l, r, false ), tfnc( 2*v+1, mid+1, tr, l, r, false ) );
    }
}
stree;

vector<int> distribute_candies( vector<int> c, vector<int> l, vector<int> r, vector<int> v )
{
    int n = c.size();
    int m = v.size();
    
    vector< vector< pair<int,int> > > event( n+1 );
    
    for ( int i=0; i<m; i++ )
    {
        event[ l[i] ].push_back({ i+1, v[i] });
        event[ r[i]+1 ].push_back({ i+1, -v[i] });
    }
    
    stree.init(m+1);
    
    vector<int> ans(n);
    
    for ( int i=0; i<n; i++ )
    {
        for ( auto& [ind,delt] : event[i] )
            stree.tadd( 1, 0, m, ind, m, delt );
        
        int p = stree.fnd( 1, 0, m, c[i], 1e18, -1e18 );
        
        ll endval = stree.tget( 1, 0, m, m );
        
        if ( p == 0 )
            ans[i] = endval;
        else
        {
            ll x = stree.tget( 1, 0, m, p-1 );
            
            ll mini = stree.tfnc( 1, 0, m, p, m, true );
            ll maxi = stree.tfnc( 1, 0, m, p, m, false );
            
            if ( x < mini )
                ans[i] = endval - ( maxi - c[i] );
            else
                ans[i] = endval - mini;
        }
    }
    
    return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 0 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 172 ms 106784 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 296 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Incorrect 193 ms 42380 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 0 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -