LOJ # 2508. "AHOI / HNOI2018" juego de clasificación topológica

Buenos dioses una pregunta!   

Dado que sólo hay una puerta para cada tecla correspondiente, el orden relativo para desbloquear la puerta entre nosotros y la puerta se puede determinar.   

Por ejemplo, abrir la puerta $ (x, x + 1) $ es, si el $ [1, x] $ entre $ x + 1 $ no puede en todo caso en el lado de $ X $, $ X $ es posible, pero puede para llegar a $ x + 1 $ aquí. 

Así que fuimos a desbloquear $ x + 1 $, y luego ir a desbloquear $ x $, por lo que $ x $ pueden heredar directamente ampliar el resultado de $ x + 1 $ a.      

código:   

<. bits / STDC ++ h> #include    
#define ll largo largo 
#define N 1000200 
#define setIO (s) freopen (s ".En", "r", stdin) 
usando namespace std;   
bordes int = 1; 
int hd [N], a [N << 1], nex [N << 1], deg [N];     
add void (int u, int v) 
{ 
    nex [++ bordes] = hd [u], hd [u] = bordes, a [bordes] = v;       
    deg [v] ++;  
} 
Int n, m, Q, p [N], tot, tecla [N]; 
cola <int> q;  
void topo () 
{ 
    int i, j;  
    for (i = n; i; - i) if (! deg [i]) q.push (i);    
    mientras que (q.empty ()!) 
    { 
        int u = q.front (); q.pop (); p [++ tot] = u;    
        for (int i = hd [u]; i;    
        {
            --deg [v];  
            si: (Grados [v]!)    
                q.push (v);   
        } 
    } 
} 
L [N] int, R [N];    
void cal (int x) 
{ 
    int l = x, r = x;   
    while (1) 
    { 
        int pl = l, pr = r;   
        mientras que (l> 1 && (tecla [l-1] || (l <= tecla [l-1] && tecla [l-1] <= r))!)    
            l = L [l-1];   
        mientras que (r <n && (tecla [r] || (l <= [R] && tecla [r] <= r))!)    
            r = R [R + 1];      
        si (l == pl && r == pr)    
            break;     
    } 
    L [x] = l, R [x] = r;   
} 
Int main () 
{
    // setIO ( "input");  
    int i, j;  
    scanf ( "% d% d% d", y n, y m, y Q);   
    for (i = 1; i <= m; ++ i) 
    { 
        int x, y;  
        scanf ( "% d% d", y x, y y);  
        tecla [x] = y;   
        si (y <= x)    
            add (x + 1, x);   
        otro 
            add (x, x + 1);  
    } 
    Topo ();      
    for (i = 1; i <= n; ++ i) 
        L [i] = R [i] = i;   
    for (i = 1; i <= n; ++ i)    
        cal (p [i]);   
    while (Q--) 
    { 
        int s, t; 
        scanf ( "% d% d", & s, y t);    
        si (L [s] <= t && t <   
            = R [s]) printf ( "SÍ \ n");  
        más
            printf ( "NO \ n");  
    } 
    Return 0; 
}

  

Supongo que te gusta

Origin www.cnblogs.com/guangheli/p/12459948.html
Recomendado
Clasificación