Codeforces Ronda # 692 (Div.2, basado en la Ronda de Eliminación 3 de Technocup 2021) C.Pasadas Torres 并 查 集

Se le da un tablero de ajedrez × n. Las filas y columnas del tablero están numeradas del 1 al n. La celda (x, y) se encuentra en la intersección de la columna número xy la fila número y.

La torre es una pieza de ajedrez, que en un turno puede mover cualquier número de celdas vertical u horizontalmente. Hay m torres (m <n) colocadas en el tablero de ajedrez de tal manera que ningún par de torres se ataca entre sí. Es decir, no hay par de torres que compartan fila o columna.

En un turno puedes mover una de las torres cualquier número de casillas vertical u horizontalmente. Además, no debería ser atacado por ninguna otra torre después del movimiento. ¿Cuál es el número mínimo de movimientos necesarios para colocar todas las torres en la diagonal principal?

La diagonal principal del tablero de ajedrez son todas las celdas (i, i), donde 1≤i≤n.

Entrada
La primera línea contiene el número de casos de prueba t (1≤t≤103). A continuación, se describen los casos de prueba t.

La primera línea de cada caso de prueba contiene dos números enteros nym - tamaño del tablero de ajedrez y el número de torres (2≤n≤105, 1≤m <n). Cada una de las siguientes m líneas contiene dos números enteros xi y yi - posiciones de las torres, la i-ésima torre se coloca en la celda (xi, yi) (1≤xi, yi≤n). Está garantizado que no hay dos torres que se ataquen entre sí en la ubicación inicial.

La suma de n en todos los casos de prueba no excede 105.

Salida
Para cada uno de los casos de prueba t, imprima un solo entero: el número mínimo de movimientos necesarios para colocar todas las torres en la diagonal principal.

Se puede demostrar que esto siempre es posible.

Ejemplo de entrada
Copia
4
3 1
2 3
3 2
2 1
1 2
5 3
2 3
3 1
1 2
5 4
4 5
5 1
2 2
3 3
salida Copia
1
3
4
2
Nota
Posibles movimientos para los primeros tres casos de prueba:

(2,3) → (2,2)
(2,1) → (2,3), (1,2) → (1,1), (2,3) → (2,2)
(2,3 ) → (2,4), (2,4) → (4,4), (3,1) → (3,3), (1,2) → (1,1)
** Al comienzo de la escritura Pensé que solo había dos posibilidades: my M + 1. Después de escribirlo por un tiempo, encontré wa4, lo que significa que es imposible confiar en un método especial. **
Más tarde descubrí que hay un punto en mi Situación m + 1. Hay personas que lo bloquean desde la línea diagonal de la línea horizontal a la línea diagonal de la línea vertical, por lo que debe dar dos pasos más, luego puedo encontrar cuántos "anillos" de este tipo, y finalmente el El número de veces que tengo que moverme es m -El número de veces que el círculo del punto + n en la diagonal necesita moverse más
cf y todavía debe muchas preguntas, así que tengo que pagar intereses más tarde. . . El hierro para las competiciones regionales tiene que ir a Kangkang QAQ

#include<map>
#include<stack>
#include<queue>
#include<string>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define ls (k<<1)
#define rs (k<<1|1)
#define pb push_back
#define mid ((l+r)>>1)
#include<bits/stdc++.h>
using namespace std;
const int p=1e4+7;
const int mod=1e9+7;
const int maxn=1e6+1;
typedef long long ll;
const int inf=0x3f3f3f3f;
int a[20];
int root[maxn];
int find(int x)
{
    
    
    return x==root[x]?x:root[x]=find(root[x]);
}
void solve(){
    
    
    int t;
    cin>>t;
    while(t--)
    {
    
    
        ll n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++){
    
    
            root[i]=i;
        }
        ll alr=0;
        ll cyc=0;
        for(int i=1;i<=m;i++)
        {
    
    
            ll a,b;
            cin>>a>>b;
            if(a==b)
            {
    
    
                alr++;
            }
            else{
    
    
                ll x1=find(a);
                ll y1=find(b);
                if(x1!=y1){
    
    
                    root[x1]=y1;
                }
                else{
    
    
                    cyc++;
                }
            }
        }
        cout<<m-alr+cyc<<endl;
    }
}
int main()
{
    
    
   	ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
	solve();
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_45891413/article/details/111499702
Recomendado
Clasificación