Submission #286716

#TimeUsernameProblemLanguageResultExecution timeMemory
286716CaroLindaSky Walking (IOI19_walk)C++14
0 / 100
55 ms10800 KiB
#include <bits/stdc++.h>
#include "walk.h"

#define sz(x) (int)x.size()
#define mkt make_tuple
#define lp(i,a,b) for(int i = a ; i < b ; i++ )
#define ff first
#define ss second
#define pb push_back
#define ll long long
#define mk make_pair
#define pii pair<int,int>
#define debug printf
#define all(x) x.begin(),x.end()
#define tiii tuple<int,int,int>

const int MAXN = 1e5+100 ;
const int inf = 1e9+7 ;
const ll linf = 1e18+10 ;

using namespace std ;

struct Seg
{

    vector<int> y ;
    int id[MAXN*4] , mx[MAXN*4] ;

    int m(int l, int r) { return (l+r)>>1 ; }
    void upd(int pos, int l, int r, int beg, int en , int k )
    {

        if( l > en || r < beg ) return ;

        mx[pos] = k ;

        if(l >= beg && r <= en)
        {
            id[pos] = k ;
            return ;
        }

        upd(pos<<1 , l, m(l,r) , beg, en, k ) ;
        upd(pos<<1|1 , m(l,r) + 1 , r , beg, en ,k ) ;

    }
    int qry(int pos, int l, int r, int beg, int en)
    {

        if( l > en || r < beg ) return sz(y)-1 ;
        if( l >= beg && r <= en ) return mx[pos] ;

        int al = qry(pos<<1 , l, m(l,r) , beg, en ) ;
        int ar = qry(pos<<1|1 , m(l,r)+1, r, beg, en ) ;

        if( y[ id[pos] ] <= min( y[ al ] , y[ar] ) ) return id[pos] ;

        return y[al] < y[ar] ? al : ar ;

    }

} seg ;

struct Event
{
    int y , l , r , id ;

    Event(int y = 0 ,int l = 0 , int r = 0 , int id = 0 ) : y(y) , l(l) , r(r) , id(id) {}

    bool operator < ( Event other ) const { return y > other.y ; }

};

int N , M , S , G ;
vector<Event> sweep ;
vector<pii> adj[MAXN] ;
ll dist[MAXN] ;

void dijkstra()
{
    lp(i,0,M) dist[i] = linf ;
    dist[M-2] = 0 ;

    priority_queue< pair<ll,int> , vector<pair<ll,int> > , greater< pair<ll,int> > > fila ;
    fila.push(mk(0,M-2)) ;

    while(!fila.empty())
    {
        int x = fila.top().ss ;
        ll d = fila.top().ff ;

        fila.pop() ;

        if(d != dist[x]) continue ;

        for(auto e : adj[x] )
        {
            ll dd = d + (ll)e.ss ;
            if(dd >= dist[e.ff]) continue ;

            fila.push( mk( (dist[e.ff] = dd) , e.ff ) ) ;

        }

    }

}

long long min_distance(vector<int> x, vector<int> h, vector<int> l, vector<int> r, vector<int> y, int s, int g)
{

    if(s == g) return 0LL ;

    N = sz(x) ;
    l.pb(0) ;
    r.pb(0) ;
    y.pb(0) ;
    l.pb( N-1 ) ;
    r.pb(N-1) ;
    y.pb(0) ;
    M = sz(l) ;
    S = s ;
    G = g ;

    lp(i,0,M)
    {
        sweep.pb( Event( y[i] , l[i] , r[i] , i) ) ;
        seg.y.pb( y[i] ) ;
    }
    seg.y.pb( inf ) ;
    lp(i,0,MAXN*4) seg.id[i] = seg.mx[i]= sz(seg.y) - 1 ;

    sort(all(sweep)) ;

    for(auto e : sweep )
    {

       // debug("Processing %d %d %d\n" , e.y , e.l , e.r ) ;

        int mnY = seg.qry( 1 , 1 , N , e.l + 1 , e.r+1 ) ;
        seg.upd(1,1,N, e.l + 1 ,e.r + 1 , e.id ) ;

        //debug("E deu %d\n\n" , mnY ) ;

        if( mnY == sz(y) ) continue ;

        adj[ mnY ].pb( mk( e.id , y[mnY] - y[e.id] ) ) ;
        adj[e.id].pb( mk( mnY , y[mnY] - y[e.id] ) ) ;

    }

   /* lp(i,0,M)
    {
        debug("Adjacency of %d (%d %d %d):\n", i , l[i] , r[i] , y[i] ) ;
        for(auto e : adj[i]) debug("%d %d\n" , e.ff, e.ss ) ;
        debug("\n") ;
    } */

    dijkstra() ;

    if( dist[M-1] == linf ) return -1 ;

    return x[N-1] - x[0] + dist[M-1] ;

}
#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...