Codeforces Ronda # 628 (Div. 2) Resumen

UN

Salida \ (1, n-1 \ )

#include <bits/stdc++.h>
using namespace std;

signed main() {
    int t,a,b;
    cin>>t;
    while(t--) {
        cin>>a;
        cout<<1<<" "<<a-1<<endl;
    }
}

si

Diferente número de dígitos

#include <bits/stdc++.h>
using namespace std;

set<int> s;
int t,n,a[100005];

signed main() {
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--) {
        cin>>n;
        for(int i=1;i<=n;i++) {
            cin>>a[i];
            if(s.find(a[i])==s.end()) s.insert(a[i]);
        }
        cout<<s.size()<<endl;
        s.clear();
    }
}

C

Todos los lados de la peso borde árboles asignado \ (0,1, ..., n- 2 \) máximo MEX en el camino mínimo requerido entre dos puntos cualesquiera

Si el árbol es una cadena, la respuesta es \ (n - 1 \) , configurado solo borde derecho

Si el árbol no es una cadena, la respuesta es \ (2 \) , encontrar un mayor grado que \ (2 \) punto para encontrar cualquiera de sus tres lados, por lo que es \ (0,1,2 \) , otro ambiente informal

#include <bits/stdc++.h>
using namespace std;

const int N = 200005;
int n,u,v,d[N],a[N];
vector <int> id[N];

signed main() {
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<n;i++) {
        cin>>u>>v;
        d[u]++;
        d[v]++;
        id[u].push_back(i);
        id[v].push_back(i);
    }
    int p=max_element(d+1,d+n+1)-d;
    if(d[p]<=2) {
        for(int i=1;i<n;i++) cout<<i-1<<endl;
    }
    else {
        a[id[p][0]]=1;
        a[id[p][1]]=2;
        a[id[p][2]]=3;
        int ind=3;
        for(int i=1;i<n;i++) if(a[i]==0) a[i]=++ind;
        for(int i=1;i<n;i++) cout<<a[i]-1<<endl;
    }
}

re

Dada \ (U, V \ Leq 18 es 10 ^ {} \) , encuentre la matriz más corta, tal como XOR y \ (U \) , era álgebra y \ (V \)

Si \ (u, v \) de paridad diferente, o \ (T> v \) , ciertamente no es legítimo

Así que \ (vu \) debe ser un número par, de manera intuitiva, podemos utilizar \ (u, (vu) / 2, (vu) / 2 \) para representar, pero hay algunos entre no óptimo, hay otras ilegales de

Si y sólo si \ (U = V = 0 \) , la salida puede ser una matriz vacía

Si y sólo si \ (U = V \) , representado por la anteriormente descrita ilegal, pero esta vez sólo el número en sí mismo puede ser un, \ (n- =. 1 \)

Considere cuando \ (n = 2 \)

Obviamente \ (u = 0 \) cuando pueda

En otros casos, \ ((T + V) / 2, (Vu) / 2 \) O-exclusiva valor igual a \ (U \)

#include <bits/stdc++.h>
using namespace std;

#define int long long
int u,v;

signed main() {
    cin>>u>>v;
    if((u-v)%2 || u>v) cout<<-1;
    else if(u==0&&v==0) cout<<0;
    else if(u==v) cout<<1<<endl<<u;
    else if(u==0) cout<<2<<endl<<v/2<<" "<<v/2;
    else if((((v+u)/2)^((v-u)/2))==u) cout<<2<<endl<<(v+u)/2<<" "<<(v-u)/2;
    else cout<<3<<endl<<u<<" "<<(v-u)/2<<" "<<(v-u)/2;
}

mi

Desde hace algún número, el número no sea superior a la cantidad de cada factor \ (7 \) , de tal forma que el producto del número de cuadrados perfectos buscan sucedido elegidos

Dado que el número no supera el número de cada factor \ (7 \) , el número de factor de calidad para cada cierto número de \ (\ leq 2 \)

Por lo que una idea muy intuitiva es que, para el número de factores primos para la \ (2 \) número, podemos configurar los nodos del factor de calidad, entonces el número de aristas es

Si los factores primos de un número único (si hay dos factores primos y el exponente es un factor de calidad \ (2 \) que como \ (0 \) de procesamiento), entonces la acumulación adicional de un \ (1 \) nudo punto, este factor de calidad \ (1 \) de borde conectado para representar el número de

Si sólo uno de una serie de exponente y es un factor de calidad \ (2 \) , ya que es auto-loop, o tiempo de salida directa \ (1 \) termina entonces

Después de este mapa edificio, buscando el anillo más pequeño en esta figura es la respuesta

El anillo debe encontrar un punto \ (\ leq \ sqrt {\ a_i max} \)

Así que a partir de estos números sólo comenzará a la violencia BFS

F

Dado un grafo no dirigido, para encontrar al menos \ (\ lceil \ sqrt n \ rceil \) anillo de puntos o exactamente \ (\ lceil \ sqrt n \ rceil \) conjunto independiente de puntos

El establecimiento de un árbol DFS, enumerar todos los bordes no arbóreas, si la profundidad de la diferencia entre los dos puntos está conectado a un no-árbol bordes encontraron \ (\ GEQ [\ sqrt n-] -1 \) , entonces la salida de

De lo contrario, debe ser un conjunto independiente calificado, por lo que todavía ver Figura DFS de nuevo, a un punto, podemos elegir para elegir, y todo punto a la adyacente marcado

Tenga en cuenta que el marcado Después de procesar todos los puntos adyacentes a este punto puede garantizar un óptimo (el lugar sensación muy extraña, cambio de última hora para encender los ciegos)

#include <bits/stdc++.h>
using namespace std;

const int N = 500005;

int n,m,t1,t2,t3,lim;
int dep[N],vis[N],fg[N];
vector <int> g[N];
vector <int> sta;

void dfs1(int p) {
    sta.push_back(p);
    vis[p]=1;
    for(int q:g[p]) {
        if(!vis[q]) {
            dep[q]=dep[p]+1;
            dfs1(q);
        }
        else {
            if(dep[q] && dep[p]-dep[q]>=lim-1) {
                cout<<2<<endl<<dep[p]-dep[q]+1<<endl;
                while(sta.back()!=q && sta.size()) {
                    cout<<sta.back()<<" ";
                    sta.pop_back();
                }
                cout<<q<<endl;
                exit(0);
            }
        }
    }
    sta.pop_back();
}

void dfs2(int p) {
    vis[p]=1;
    for(int q:g[p])
        if(!vis[q]) dfs2(q);

    for(int q:g[p]) if(!fg[p]) fg[q]=1;
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>m;
    lim=1;
    while(lim*lim<n) ++lim;
    for(int i=1;i<=m;i++) {
        cin>>t1>>t2;
        g[t1].push_back(t2);
        g[t2].push_back(t1);
    }
    dep[1]=1;
    dfs1(1);
    memset(vis,0,sizeof vis);
    dfs2(1);
    int cnt=lim;
    cout<<1<<endl;
    for(int i=1;i<=n && cnt;i++) {
        if(!fg[i]) cout<<i<<" ", --cnt;
    }
}

Supongo que te gusta

Origin www.cnblogs.com/mollnn/p/12521351.html
Recomendado
Clasificación