Solución a un problema Codeforces Ronda # 615 (Div. 3) (CF1294)

tema Enlace

A, B, C directamente en el código de barras

UN

#include <bits/stdc++.h>
using namespace std;
signed main() {
    int T; scanf ("%d", &T);
    while (T--) {
        int a, b, c, n;
        scanf ("%d %d %d %d", &a, &b, &c, &n);
        int s = a + b + c + n;
        if (s % 3 == 0 && s / 3 >= max (a, max (b, c))) puts ("YES");
        else puts ("NO");
    }
    return 0;
}

si

#include <bits/stdc++.h>
using namespace std;
struct node {
    int x, y;
    bool operator < (const node &t) {
        return x == t.x ? y < t.y : x < t.x;
    }
} p[1024];
char ch[100000];
signed main() {
    int T; scanf ("%d", &T);
    while (T--) {
        int n; scanf ("%d", &n);
        for (int i = 1; i <= n; ++i) scanf ("%d %d", &p[i].x, &p[i].y);
        sort (p + 1, p + n + 1);
        int s = 0, h = 0;
        bool ok = 1;
        for (int i = 1; i <= n; ++i) {
            if (p[i].y < h) {ok = 0; break;}
            for (int j = 1; j <= p[i].x - p[i - 1].x; ++j) ch[++s] = 'R';
            for (int j = 1; j <= p[i].y - p[i - 1].y; ++j) ch[++s] = 'U';
            h = max (h, p[i].y);
        }
        if (ok) {
            puts ("YES");
            for (int i = 1; i <= s; ++i) cout << ch[i]; puts ("");
        }else puts ("NO");
    }
    return 0;
}

C

#include <bits/stdc++.h>
using namespace std;
const int N = 1E5, M = 1E9;
int k[N], p[N], tot, c[N];
inline void Pre_work () { 
    for (int i = 2; i * i <= M; ++i) {
        if (!k[i]) p[++tot] = i;
        for (int j = 1; j <= tot && 1ll * i * i * p[j] * p[j] <= M; ++j) {
            k[i * p[j]] = 1;
            if (i % p[j] == 0) break;
        }
    }
}
inline int Pow (int a, int b) {
    int res (1);
    while (b) {
        if (b & 1) res *= a;
        b >>= 1, a *= a;
    } return res;
}
signed main() {
    int T; scanf ("%d", &T);
    Pre_work ();
    while (T--) {
        int n, a (0), b (0), c (0); scanf ("%d", &n); int t = n;
        for (int i = 1; i <= tot; ++i) {
            int cnt = 0, mx = 1;
            while (n % p[i] == 0) n /= p[i], ++cnt;
            if (!cnt) continue;
            if (!a) {
                a = Pow (p[i], mx);
                cnt -= mx, ++mx;
                if (cnt >= mx) {
                    b = Pow (p[i], mx), cnt -= mx, ++mx;
                    if (t / a / b != a && t / a / b != b && t / a / b > 1) {c = t / a / b; break;}
                }
            }
            else if (!b) {
                b = Pow (p[i], mx);
                cnt -= mx, ++mx;
                if (t / a / b != a && t / a / b != b && t / a / b > 1) {c = t / a / b; break;}
            }
            else if (!c) {
                if (t / a / b != a && t / a / b != b && t / a / b > 1) {c = t / a / b; break;}
            } else break;
        }
        if (c) puts ("YES"), printf ("%d %d %d\n", a, b, c);
        else puts ("NO");
    }
    return 0;
}

re

Cuestión está destinada: unirse a un número de secuencia cada vez, la secuencia puede ser uno cualquiera de una serie de cambios B, satisface b = a + k * x, b> = 0, y k es un entero, cada secuencia actual no es respondida el valor máximo posible del número mínimo de origen natural

Obviamente relacionada con la operación de módulo, A [i] expresado en% x el resultado es el número mínimo de número i no es, a fin de permitir el máximo número del mínimo, a un cierto número de pequeñas puesta en marcha para llenar el vacío, es decir, el número de asumir m% n = i, de modo que el primer número es i, para el segundo x + i, el tercero en 2 * x + i ......

Cuando la adición de un número p de tiempo, dejar que un [p% x] + X, a [i] es el valor inicial de i, para obtener la mejor respuesta, la respuesta final para todos a [i] es el valor min

Desde konjac más verduras, pensar en ello directamente en la línea de los árboles

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5;
int a[N], mx;
int c[N << 2];
void build (int p, int l, int r) {
    if (l == r) {c[p] = l; return;}
    int mid (l + r >> 1);
    build (p << 1, l, mid), build (p << 1 | 1, mid + 1, r);
    c[p] = min (c[p << 1], c[p << 1 | 1]);
}
inline void update (int p, int l, int r, int pos, int val) {
//    printf ("%d %d %d\n", p, l, r);
    if (l == r) {c[p] = val; return;}
    int mid = l + r >> 1;
    pos <= mid ? update (p << 1, l, mid, pos, val) : update (p << 1 | 1, mid + 1, r, pos, val);
    c[p] = min (c[p << 1], c[p << 1 | 1]);
}
signed main() {
    int n, x;
    scanf ("%lld %lld", &n, &x);
    for (int i = 0; i < x; ++i) a[i] = i; mx = 0;
    build (1, 0, x - 1);
    for (int i = 1, y; i <= n; ++i) {
        scanf ("%lld", &y);
        if (y > 0) y %= x; a[y] += x;
        update (1, 0, x - 1, y, a[y]);
        printf ("%lld\n", c[1]);
    }
    return 0;
}

mi

Significado de las preguntas: Dada una matriz, hay dos: 1, 2 para cambiar el número en una ubicación, una arbitraria "roll a" (ver la cara título específico) para convertirlo en una matriz objetivo

Fácil de conseguir que figuran significado relacionado de las preguntas cada uno, considerado por separado para cada columna

En uno, un número de esta fila es el número originalmente estado de destino se puede hacer pasar a través de varios operación de movimiento en la posición correcta, sólo puede haber un número de modificaciones, esta columna si la estadística móvil k-ésimo (0 <= k <= n - 1) sin necesidad de modificar la forma en unos pocos

Proporcionada i-ésima fila j-ésimo número de columna x, si x <= n * m && (x - j)% m == 0, x es la descripción de la j-ésima columna en el estado objetivo (x - j) / m + línea número 1, (nota que este debe ser determinada x <= n * m, el juego se determina de no buscar un largo tiempo no encontrado)

Por P = (i - (x - j) / m - 1 + n)% n movimiento operación de x en la posición correcta (+ n% n al proceso negativo) y la manipulación de matrices de recuento c c [ p] ++

La etapa de mover el último enumerado número k, las columnas necesita ans = min (k + n - c [k]), y la respuesta final a los ans acumula en res

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5;
int a[N], mx;
int c[N << 2];
void build (int p, int l, int r) {
    if (l == r) {c[p] = l; return;}
    int mid (l + r >> 1);
    build (p << 1, l, mid), build (p << 1 | 1, mid + 1, r);
    c[p] = min (c[p << 1], c[p << 1 | 1]);
}
inline void update (int p, int l, int r, int pos, int val) {
//    printf ("%d %d %d\n", p, l, r);
    if (l == r) {c[p] = val; return;}
    int mid = l + r >> 1;
    pos <= mid ? update (p << 1, l, mid, pos, val) : update (p << 1 | 1, mid + 1, r, pos, val);
    c[p] = min (c[p << 1], c[p << 1 | 1]);
}
signed main() {
    int n, x;
    scanf ("%lld %lld", &n, &x);
    for (int i = 0; i < x; ++i) a[i] = i; mx = 0;
    build (1, 0, x - 1);
    for (int i = 1, y; i <= n; ++i) {
        scanf ("%lld", &y);
        if (y > 0) y %= x; a[y] += x;
        update (1, 0, x - 1, y, a[y]);
        printf ("%lld\n", c[1]);
    }
    return 0;
}

F

El significado de los problemas: el árbol en busca de tres puntos a, b, c, por lo que un a B, B a C, C para cubrir el lado derecho de la ruta de acceso a un importe máximo de (a un lado recuento)

Greedy la obtención de un primer diámetro, el diámetro de la parte superior derecha a 0, entonces los dos diámetros desde el punto final, respectivamente, para encontrar el más lejano máximo valor

#include <bits/stdc++.h>
using namespace std;
inline void read (int &x) {
    char ch = getchar(); x = 0;
    while (!isdigit(ch)) ch = getchar();
    while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();
}
const int N = 2e5 + 10;
int n;
int cnt, to[N << 1], nxt[N << 1], h[N], d[N << 1];
inline void add (int u, int v) {
    to[++cnt] = v, d[cnt] = 1, nxt[cnt] = h[u], h[u] = cnt;
}
int tmp, mx, c[N], fr[N], fd[N];
void dfs (int u, int la, int deep) {
    if (deep > mx) mx = deep, tmp = u;
    for (int i = h[u]; i; i = nxt[i])
        if (to[i] != la) fr[to[i]] = u, fd[to[i]] = i, dfs (to[i], u, deep + d[i]);
}
int res;
signed main() {
    read (n); cnt = 1;
    for (int i = 1, u, v; i < n; ++i)
        read (u), read (v), add (u, v), add (v, u);
    dfs (1, 0, 0); mx = 0; fr[tmp] = 0;
    int a = tmp; dfs (tmp, 0, 0); int b = tmp; res = mx;
    while (fr[tmp]) d[fd[tmp]] = d[fd[tmp] ^ 1] = 0, tmp = fr[tmp];
    mx = 0; tmp = 0;
    dfs (a, 0, 0); dfs (b, 0, 0);
    int c = tmp; if (!c) c = 1;
    while (c == a || c == b) ++c;
    printf ("%d\n", mx + res);
    printf ("%d %d %d\n", a, b, c);
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/whx666/p/12446151.html
Recomendado
Clasificación