HDU-5963 Amigos pensando

Enlace del título http://acm.hdu.edu.cn/showproblem.php?pid=5963

Tucao

La primera vez que vi esta pregunta, ¿eh? ? Teoría del juego? ¿Todavía en el árbol? Parece que no lo soy. . . Pero si piensas en alguien, esto no debería ser demasiado difícil, puede ser regular

Análisis

Así que comencé a pensar cuidadosamente sobre las reglas de la muestra . La primera muestra no debería verse, pero el segundo contenido es más abundante. Pero aún no encontré nada después de simular el segundo ejemplo, ¿es realmente necesario construir un árbol de líneas o algo así? ? Luego pongo el foco en la salida, solo hay dos tipos de salida, ¿debería haber algún tipo de paridad? Todavía es necesario considerar primero la situación de la cadena, porque atravesar desde un punto en el árbol sin raíces es equivalente a caminar unas pocas cadenas (parece que la mayoría de los problemas del árbol están relacionados con la cadena). Simulemos lo siguiente.

Primero, debemos prestar atención a la pista en el título. Cada vez que necesitemos encontrar un punto con un peso de 1 en el nodo padre. Esto muestra la limitación de este problema, y ​​siempre terminará. No consideremos primero la modificación. Si toma 1 como raíz, no es difícil ver que la niña ganará. Una de las formas es, por



supuesto, que hay otras formas , pero la niña siempre gana.
¿Qué pasa si 2 se toma como raíz? No es difícil averiguar si la niña gana, una de las cuales es:



Entonces , ¿gana la niña cuando el número de bordes con un peso de borde de 1 en la figura es par? Todavía tomando 2 como raíz, nos sigue otro nodo después de 4.

Encontrarás que las chicas aún ganan de esta manera.
¿Qué pasa con este nodo después del nodo raíz 2?

En este momento, si vas a la simulación, encontrarás que el niño ganó. Entonces, suponemos que no es el número de bordes con el peso de borde de 1 en la figura, sino el número de bordes con el peso de borde de 1 alrededor del nodo raíz. Basado en esta suposición en negrita, escribí el siguiente código, que parece ser blanco Escribió una función de adición de bordes . Si vas a usar la prueba de muestra y encuentras que es correcta, entonces la entregué con entusiasmo, WA

#include<cstdio>
#include<cstring>
using namespace std;
const int N=4e4+10;
struct Edge{
    int to,nxt,val;
}e[N<<1];
int Head[N],len;
void Ins(int a,int b,int c){
    e[++len].to=b;e[len].val=c;
    e[len].nxt=Head[a];Head[a]=len;
}
int cnt[N];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        scanf("%d%d",&n,&m);
        memset(cnt,0,sizeof(cnt));
        for(int i=1;i<n;i++){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            cnt[a]+=c;
            cnt[b]+=c;
        }
        for(int i=1;i<=m;i++){
            int op,x,y,z;
            scanf("%d",&op);
            if(op==1){
                scanf("%d%d%d",&x,&y,&z);
                if(z==1)cnt[x]++,cnt[y]++;
                else cnt[x]--,cnt[y]--;
            }
            else {
                scanf("%d",&x);
                if(cnt&1)printf("Girls win!\n");
                else printf("Boys win!\n");
            }
        }
    }
}

Análisis secundario

Como este código ha pasado la muestra, muestra que no debería ser accidental, por lo que debería ser algo que no he considerado. Regresé y leí una pregunta secundaria, y descubrí que la pregunta no decía que cuando \ (op == 1 \) , el peso de la transformación es igual al peso original, es decir, si cambio 1 a 0, 0 Se convierte en 1, entonces mi código anterior está bien, que es el caso de muestra, pero el problema es que puede ser 1 se convierte en 1 y 0 se convierte en 0, por lo que cada vez que debe escanear la suma de los pesos de borde alrededor de una raíz , Que es el código a continuación.

#include<cstdio>
#include<cstring>
using namespace std;
const int N=4e4+10;
struct Edge{
    int to,nxt,val;
}e[N<<1];
int Head[N],len;
void Ins(int a,int b,int c){
    e[++len].to=b;e[len].val=c;
    e[len].nxt=Head[a];Head[a]=len;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        scanf("%d%d",&n,&m);
        memset(Head,0,sizeof(Head));
        len=0;
        for(int i=1;i<n;i++){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            Ins(a,b,c);Ins(b,a,c);
        }
        for(int i=1;i<=m;i++){
            int op,x,y,z;
            scanf("%d",&op);
            if(op==1){
                scanf("%d%d%d",&x,&y,&z);
                for(int i=Head[x];i;i=e[i].nxt)
                    if(e[i].to==y)e[i].val=z;
                for(int i=Head[y];i;i=e[i].nxt)
                    if(e[i].to==x)e[i].val=z;
            }
            else {
                int cnt=0;
                scanf("%d",&x);
                for(int i=Head[x];i;i=e[i].nxt)cnt+=e[i].val;
                if(cnt&1)printf("Girls win!\n");
                else printf("Boys win!\n");
            }
        }
    }
}

Prueba

No es muy bueno sentirse así después de escribir, y es vergonzoso si adivinas mal, así que quiero demostrarlo.
Para simplificar el problema, solo necesitamos probar la situación de la cadena. Si el peso del borde conectado al nodo raíz es 1, hay dos casos para los bordes restantes, uno es todo 1 y el otro es 0, discuta por separado.
Si contiene 0,

es porque la niña elige puntos arbitrariamente, así que deje que la niña elija el último punto, de modo que el borde que conecta el nodo raíz se establecerá en 0, y porque contiene 0, definitivamente quedará el peso del borde de 1. En este momento, debido a que los niños tienen que transformar los bordes, definitivamente transformarán el valor de peso en 1, porque el nodo raíz es 0 cuando los niños se transforman, por lo que en este caso, solo es posible que la niña haga que el nodo raíz se convierta en 0, es decir, solo Las chicas ganarán.
¿Qué pasa si no contiene 0? Esa niña puede hacer que el niño cambie de una vez, y la niña aún gana.
Cuando el valor de peso del borde que conecta el nodo raíz es 0, se invertirá y se completará la prueba.

Supongo que te gusta

Origin www.cnblogs.com/anyixing-fly/p/12682500.html
Recomendado
Clasificación