1024 Разработчик резюме теста Дня

Синхронизация: https://buringstraw.win/archives/67/

1024 Разработчик резюме теста Дня

Большой праздник, попытайтесь проверить, что ах

Сегодняшняя тема может быть найдена в Лос-Вэлли, таким образом, мы сталкиваемся с проблемой, отпустить. ,

Math (математика 1S 128M)

P3123 сказал Бесси Бесси Goes Moo Moo

При подаче электронных классных застряли, взять и скопировать диск вверх math.cppи становится искаженным. , ,Несмотря на то, написанных только 30 минут

Во- первых, сложность прямого перечисления Этот вопрос является \ (500 ^ 7 \) , он не может быть закончена.

А поскольку остаточные добавки, мультипликативный характер дела, пока граф делятся на 7 на линии, сложность \ (7 ^ 7 \) , быстро бегать

(Luo Gu 提高+/省选-трудность серьезно об этом)

Семь наборов кода, я прошу прощения за не впечатляют. , ,

#include <cstdio>

long long qz[27][8];
int n;
int main(void) {
//  freopen("math.in", "r", stdin);
//  freopen("math.out", "w", stdout);
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        char T[2];
        scanf("%s", T);
        int t;
        scanf("%d", &t);
        ++qz[T[0] - 'A'][(t + 700000) % 7];
    }
    long long res = 0;
    for (int i = 0; i <= 6; ++i) {
        for (int j = 0; j <= 6; ++j) {
            for (int k = 0; k <= 6; ++k) {
                for (int l = 0; l <= 6; ++l) {
                    for (int m = 0; m <= 6; ++m) {
                        for (int p = 0; p <= 6; ++p) {
                            for (int q = 0; q <= 6; ++q) {
                                if (((i + j * 2 + k * 2 + l) * (m + p + j + k) * (q + 2 * p)) % 7 == 0) {
                                    res += (qz['B' - 'A'][i] * qz['E' - 'A'][j] * qz['S' - 'A'][k] * qz['I' - 'A'][l] * qz['G' - 'A'][m] * qz['O' - 'A'][p] * qz['M' - 'A'][q]);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    printf("%lld\n", res);
//  fclose(stdin);
//  fclose(stdout);
    return 0;
}

Палиндромность путь (путь 1S 128M)

Путь P3126 палиндром палиндромных Дорожки

Он назвал глубину, выиграл 8 очков

Правильный ответ дп, в то же время стало ходить от левых и правых углов, два идентичных, если в текущей сетке, государство будет в состоянии передать.

iПредставляет несколько шагов, jверхний левый угол вылета пошел первые несколько строк, iпредставляет собой отход от нижнего правого угла и прошел первые несколько строк

Первый через колонки iс jили kрасчетными.

f[i][j][k]=f[i - 1][j - 1][k] + f[i - 1][j][k + 1] + f[i - 1][j][k] + f[i - 1][j - 1][ k - 1]

Тем не менее, \ (500 ^ 3 \) не только ультра-масштабные данные на более чем 512M памяти предел (про-тест), так что уровень давления.

Поскольку новое состояние и только i - 1, j, k, j - 1, k + 1, следовательно выдавить i, jобратное перечисление, kперечисление переназначение.

Следует отметить , что j, kсоотношение между начальной точкой и число шагов.

#include <cstdio>
#include <iostream>

const int MOD = 1000000007;

long long f[505][505];
char mp[505][505];
int n;

int main (void) {
    #ifndef ONLINE_JUDGE
    freopen("path.in", "r", stdin);
    freopen("path.out", "w", stdout);
    #endif
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            std::cin >> mp[i][j];
        }
    }
    if (mp[1][1] != mp[n][n]) {
        printf("0\n");
        return 0;
    }
    f[1][n] = 1;
    for (int i = 2; i <= n; ++i) {
        for (int j = i; j >= 1; --j) {
            for (int k = n - i + 1; k <= n; ++k) {
                if (mp[j][i - j + 1] == mp[k][2 * n - i - k + 1]) {
                    f[j][k] = f[j - 1][k + 1] + f[j - 1][k] + f[j][k + 1] + f[j][k];
                    f[j][k] %= MOD; 
                }
                else {
                    f[j][k] = 0;
                }
            }
        }
    }
    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        ans += f[i][i];
        ans %= MOD;
    }
    printf("%d\n", ans);
    return 0;
}

Метрополис (город 1S 128M)

P3459 MEG Мегаполис

Этот вопрос используется для поиска слов с салатом перевода Google оказался истинная магия

Suona сказал , что это dfsпоследовательность вопросов шаблонов, узнать немного и обнаружил , что на самом деле да.

#include <cstdio>

const int MAXN = 5e5 + 5;

struct ed {
    int to, nex, w;
} e[MAXN];

int head[MAXN];
int newp, n, m, time;
int l[MAXN], r[MAXN];//以p为根的子树在dfs序中的左右端点 

namespace sz {
    int c[MAXN * 4];
    inline int lowbit (int x) {
        return x & (-x);
    }
    
    void add (int k, int x) {
        for (int i = k; i <= n; i += lowbit(i)) {
            c[i] += x;
        }
    }
    
    int query (int x) {
        int ans = 0;
        for (int i = x; i >= 1; i -= lowbit(i)) {
            ans += c[i];
        }
        return ans;
    }
}

void insert (int p1, int p2) {
    ++newp;
    e[newp].to = p2;
    e[newp].nex = head[p1];
    head[p1] = newp;
}

void dfs (int p, int fa) {
    l[p] = ++time;
    for (int i = head[p]; i; i = e[i].nex) {
        int y = e[i].to;
        if (y == fa) continue;
        dfs(y, p);
    }
    r[p] = time;
}

int main (void) {
    #ifndef ONLINE_JUDGE
    freopen("city.in", "r", stdin);
    freopen("city.out", "w", stdout);
    #endif
    scanf("%d", &n); 
    for (int i = 1; i < n; ++i) {
        int p1, p2;
        scanf("%d%d", &p1, &p2);
        insert(p1, p2);
        insert(p2, p1);
    }
    dfs(1, 0);
    for (int i = 2; i <= n; ++i) {
        sz::add(l[i], 1);
        sz::add(r[i] + 1, -1);
    }
    scanf("%d", &m);
    for (int i = 1; i <= n + m - 1; ++i) {
        char T[2];
        int x, y;
        scanf("%s %d", T, &x);
        if (T[0] == 'W') {
            printf("%d\n", sz::query(l[x]));
        }
        else {
            scanf("%d", &y);
            sz::add(l[y], -1);
            sz::add(r[y] + 1, 1);
        }
    }
    #ifndef ONLINE_JUDGE
    fclose(stdin);
    fclose(stdout);
    #endif
    return 0;
}

рекомендация

отwww.cnblogs.com/buringstraw/p/11735536.html