Codeforces Ronda # 616 Iluminación de prefijo C

Título

Darte nnn estado del interruptor de luz, luego te doykkk subconjuntos. Al seleccionar un subconjunto, se presionará el interruptor correspondiente a todos los números del subconjunto. mi m_imetroyoRepresenta el primero ii¿Cuántos subconjuntos se deben seleccionar al menos cuando todas las luces i están encendidas y se encuentran todasmi (i ∈ [1, n]) m_i (i \ in [1, n])metroyo( yo[ 1 ,n ] )
Algunas restricciones:

  1. La intersección de cualesquiera tres subconjuntos es un conjunto vacío.
  2. Debe haber un método de selección para que todas las luces estén encendidas

norte, k ≤ 3 e 5 norte, k \ le 3e5 n ,k3 y 5

Ideas de resolución de problemas:

Observe primero las condiciones de restricción: la
condición 1 equivale a que una lámpara esté controlada por dos subconjuntos como máximo. Luego, si está controlado por dos subconjuntos, conecte un borde entre los dos subconjuntos. Si el estado original de la lámpara es 0, entonces los dos subconjuntos deben elegir 1 de 2, y si el estado original es 1, entonces el estado de selección de los dos subconjuntos debe ser el mismo. Si está controlado por un subconjunto, entonces si originalmente era 0, entonces este subconjunto debe seleccionarse; de ​​lo contrario, este subconjunto no debe seleccionarse.
Luego, puede usar el conjunto de búsqueda de unión para mantener la relación entre los puntos. Si no hay restricción de que un determinado punto debe seleccionarse o no debe seleccionarse en un bloque conectado, el número más pequeño de los dos puntos se usará para contribuir a la respuesta, de lo contrario se tomará Limite los puntos correspondientes para contribuir a la respuesta. La condición 2 garantiza que no habrá conflictos cuando se recopilen y mantengan los bloques conectados.

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 3e5 + 50;
char s[maxn];
int fa[maxn], f[maxn], must[maxn], sz[maxn][2];
vector<int> v[maxn];
int fnd(int x){
    
    
    if(x == fa[x]) return x;
    int t = fa[x];
    fa[x] = fnd(fa[x]);
    f[x] = f[t]^f[x];
    return fa[x];
}
int ans;
void link( int x, int y, int w){
    
    
    int rx = fnd(x), ry = fnd(y);
    if(rx == ry) return;
    if(must[rx] == -1) ans -= min(sz[rx][0], sz[rx][1]);
    else ans -= sz[rx][must[rx]];
    if(must[ry] == -1) ans -= min(sz[ry][0], sz[ry][1]);
    else ans -= sz[ry][must[ry]];
    f[ry] = f[x]^f[y]^w;
    fa[ry] = rx;
    sz[rx][0] += sz[ry][f[ry]];
    sz[rx][1] += sz[ry][f[ry]^1];
    if(must[rx] == -1 && must[ry] != -1) must[rx] = must[ry]^f[ry];
    if(must[rx] == -1) {
    
    
        ans += min(sz[rx][0], sz[rx][1]);
    }
    else ans += sz[rx][must[rx]];
    return;
}
int main()
{
    
    
    int n, k; cin>>n>>k;
    for(int i = 1; i <= k; ++i) fa[i] = i, must[i] = -1, f[i] = 0, sz[i][0] = 1;
    scanf("%s", s+1);
    for(int i = 1; i <= k; ++i){
    
    
        int c; scanf("%d", &c);
        while(c--){
    
    
            int x; scanf("%d", &x);
            v[x].push_back(i);
        }
    }
    ans = 0;
    for(int i = 1; i <= n; ++i){
    
    
        if(s[i] == '0'){
    
    
            if(v[i].size() == 1){
    
    
                int x = v[i][0];
                int rx = fnd(x);
                if(must[rx] == -1){
    
    
                    must[rx] = f[x];
                    ans -= min(sz[rx][0], sz[rx][1]);
                    ans += sz[rx][must[rx]];
                }
            }
            else {
    
    
                link(v[i][0], v[i][1], 1);
            }
        }
        else{
    
    
            if(v[i].size() == 2){
    
    
                link(v[i][0], v[i][1], 0);
            }else if(v[i].size() == 1){
    
    
                int x = v[i][0];
                int rx = fnd(x);
                if(must[rx] == -1){
    
    
                    must[rx] = f[x]^1;
                    ans -= min(sz[rx][0], sz[rx][1]);
                    ans += sz[rx][must[rx]];
                }
            }
        }
        printf("%d\n", ans);
    }
}


Supongo que te gusta

Origin blog.csdn.net/qq_43202683/article/details/104154869
Recomendado
Clasificación