CF 1033C Permutación juego topológica de clasificación +

Significado de las preguntas: una gama completa, Alice puede partir de un cierto número, vaya a j de las condiciones I son:

un [j]> a [i], y para cumplir de i a j | ij |% a [i] = 0, si hay una alice el número ganador política, la salida B, o A

Ideas, clasificación + teoría del juego topológica (esta pregunta me dejó hacer demasiado perdida solo), asociado con el número y varias otras conexiones con la mesa de al lado, si al primer grado 0, es decir, Alice seleccionar este punto, la otra parte no puede alrededor de otro punto, Alice victoria, las coordenadas se almacenan en una matriz, entonces ellos son el análisis de borde conectado, puede determinar quién gana, el código para ver los detalles.

#include <iostream> 
#include <vector> 
#include <cmath> 
#include < set > 
#include <mapa> 
#include <cstring> 
#include <cola> 
#include <pila> 
#include <algoritmo>
 usando  espacio de nombres std;
#define ll largo largo
 #define N 200005
 #define fori for (i = 0; i <n; i ++)
 #define fori1 para (i = 1; i <= n; i ++)
CL a [N];
vector <ll> G [N];
Char s [N];
grado ll [N];
ll q [N];
ll vis [N];
void DFS ()
{

}
int main ()
{
    
    ll i, j, k;
    ll n;

    cin >> n;
    para (i = 1 ; i <= n; i ++ )
        cin >> a [i];
    para (i = 1 ; i <= n; i ++ )
    {
        para (j = i + a [i]; j <= n; j + = a [i])
             si (a [j]> a [i]) G [j] .push_back (i), el grado [i] ++; // 邻接表,拓扑重要一环节
        para (j = i - a [i]; j> = 1 ; j - = a [i])
             si (a [j]> a [i]) G [j]. push_back (i), el grado [i] ++ ;
    }    
    memset (vis, - 1 , sizeof (vis));
    L LL = 1. , R & lt = 0 ;
     para (i = 1. ; I <= N-; I ++ )
         SI Q [R & lt ++] = I, VIS [I] = (Grado [I]!) 0 ; // Penetración es 0, en q matriz, el punto necesariamente alice victoria (seleccionar el punto no puede tomar) 
    el tiempo (L <= R & lt) {
         int U = q [L ++ ];
         para (i = 0 ; I <G [U] .size (); i ++) // relacionada con este punto será colocado alice sangré oponente este punto 
        {
             int V = G [U] [I];
             IF (VIS [V] == - 1. ) { // Si vis [u] es alice victoria, el oponente gana el punto V, de lo contrario oponentes lose
                IF (mostrar [i] == 0 ) vista [v] = 1 ;
                detallada vista [V] = 0 ;
            }
            más 
                si (ver [u] == 0 ) vista [v] = 1 ;
            Grado [V] -; // los grados menos, si el grado es 0, entonces el punto puede ser una victoria punto 
            IF Q [R & lt ++] = (! Grado [V]) V;
        }
    }
    para (i = 1 ; i <= n; i ++ )
         si (vis [i]) cout << ' A ' ;
        otro tribunal << ' B ' ;

}

 

Supongo que te gusta

Origin www.cnblogs.com/ch-hui/p/12642871.html
Recomendado
Clasificación