LOJ # 2508. "AHOI / HNOI2018" jogo de ordenação topológica

Bons deuses uma pergunta!   

Uma vez que existe apenas uma porta para cada tecla correspondente, a ordem relativa para destrancar a porta entre nós e a porta pode ser determinada.   

Por exemplo, abrir a porta $ (x, x + 1) $ é, se o $ [1, X] $ entre $ x + 1 $ que não podem, em qualquer caso, para o lado de $ X $, $ X $ é possível, mas pode para chegar a US $ x + 1 $ aqui. 

Então nós fomos para desbloquear $ x + 1 $, em seguida, ir para desbloquear $ x $, então $ x $ pode herdar diretamente expandir o resultado de US $ x + 1 $ a.      

código:   

<. bocados / STDC ++ H> #include    
#define ll longo longo 
#define N 1.000.200 
#define setIO (s) fReopen (s ".in", "R", entrada padrão) 
usando o espaço de nomes std;   
bordas int = 1; 
int hd [N], para [N << 1], Nex [N << 1], ° [N];     
Void Adicionar (int u, int v) 
{ 
    nex [++ bordas] = hd [u], hd [u] = bordas, para bordas [] = v;       
    deg [v] ++;  
} 
Int n, m, Q, P [N], tot, tecla [N]; 
fila <int> q;  
vazio TOPO () 
{ 
    int i, j;  
    for (i = n; i; - i) if (! deg [i]) q.push (i);    
    while (q.empty ()!) 
    { 
        int u = q.front (); q.pop (); p [++ tot] = L;    
        para (int i = hd [u]; i; i = NEX [i])    
        {
            int v = a [i];   
            --deg [v];  
            if (deg [v]!)    
                q.push (v);   
        } 
    } 
} 
Int L [N], R [N];    
vazio cal (int x) 
{ 
    int = l x, r = x;   
    enquanto (1) 
    { 
        int pl = l, pr = r;   
        enquanto (L> 1 && (tecla [L-1] || (l <= tecla [L-1] && tecla [L-1] <= r))!)    
            L = L [L-1];   
        enquanto (r <N && (tecla [r] || (l <= tecla [r] && tecla [r] <= r))!)    
            r = R [I + 1];      
        se (l == pl && r == PR)    
            break;     
    } 
    L [X] = l, R [X] = r;   
} 
Int main () 
{
    // setIO ( "input");  
    int i, j;  
    scanf ( "% d% d% d", e n, m &, & Q);   
        if (L [S] <= T && t <   
            = R [s]) printf ( "SIM \ n");  
        outro
    for (i = 1; i <= m; i ++) 
    { 
        int x, y;  
        scanf ( "% d% d", & X, & Y);  
        tecla [X] = y;   
        se (y <= x)    
            suplemento (x + 1, x);   
        outra 
            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]);   
    enquanto (Q--) 
    { 
        int S, T; 
        scanf ( "% d% d", e s, & t);    
            printf ( "NÃO \ n");  
    } 
    Return 0; 
}

  

Acho que você gosta

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