SSL-OI夏日合宿 2020.08.23 A组

今天的题略水, 可能是因为最后一天了, AJ让我么轻松一点. 前三道题是AJ直接拿的中山市选2012, 第四题是北爷挑的附加题. 但我没写 C打挂了, 最后100+80+0+0=180 然后下午发动了学长限定技能: 快速讲评快速下班. A 这是一棵树吗? 题意 给出一张图nn个点的度数, 问是否可能是一棵树. 故事 超级大水题, 显然一棵树上有n1n1条边, 每加入一条边会使整张图的度数和增加22. 判断度数和是否为2n22n2, 特

今天的题略水, 可能是因为最后一天了, AJ让我么轻松一点. 前三道题是AJ直接拿的中山市选2012, 第四题是北爷挑的附加题. (但我没写) C打挂了, 最后100+80+0+0=180 然后下午发动了学长限定技能: 快速讲评快速下班.

A 这是一棵树吗?

题意

给出一张图nn个点的度数, 问是否可能是一棵树.

故事

超级大水题, 显然一棵树上有n1n-1条边, 每加入一条边会使整张图的度数和增加22. 判断度数和是否为2n22n-2, 特判如果n>2n>2, 任一点的读书不能为0.

#include <stdio.h>

long long n, s;
bool pos = true;

signed main() {
#ifndef ONLINE_JUDGE
    freopen("A.in", "r", stdin);
#endif

    scanf("%lld", &n);
    for (long long i = 0, a; i < n; ++i)
        scanf("%lld", &a), pos &= (a > 0), s += a;

    if (s == (n - 1) * 2 && (n == 1 || pos))
        printf("Possible");
    else
        printf("Impossible");

    return 0;
}

B 选数排列

题意

给出nn个数, 从中选出RR组, 每组CC个. 每组的贡献是其中的最大值减最小值, 问这RR组的最大值最小是多少.

故事

还是那句话: 不贪心的人在比赛中也不会贪心.

为什么我一直对贪心的正确性那么怀疑呢? 还是因为对没能证明的东西总会有莫名的恐惧?

最后我打了O(n2)O(n^2)的暴力, 因为数据年代久远所以拿了80? (这次我没在暴力外面套数据范围判断)

一个显然的结论: 每次选的数比是排完序后数组内的一段数. 如果有两组数所属的区间相交, 肯定可以通过交换元素使两者的最大值/最小值变优.

fi,jf_{i,j}为选了ii组, 选到了第jj个数, 每组贡献的最大值的最小值. 转移如下:

fi,j=mink=0kjCfi1,k + PjPjCf_{i,j}=min_{k=0}^{k \leq j-C}f_{i-1,k} \ + \ P_j - P_{j-C}

#define MXN (500020)

#include <stdio.h>
#include <string.h>

#include <algorithm>

int N, R, C;
int P[MXN];

// Sub1
int a[MXN], f[1024][1024], min, ans = 1e9;

signed main() {
#ifndef ONLINE_JUDGE
    freopen("B.in", "r", stdin);
#endif

    scanf("%d%d%d", &N, &R, &C);
    for (int i = 0; i < N; ++i)
        scanf("%d", &P[i]);

    std::sort(P, P + N);

    for (int i = C - 1; i < N; ++i)
        a[i] = P[i] - P[i - C + 1];

    memset(f, 0x3f, sizeof(f));
    for (int i = 0; i <= N; ++i)
        f[0][i] = 0;
    for (int i = 1, j; i <= R; ++i)
        for (min = 1e9, j = C - 1; j < N; ++j)
            f[i][j] = std::max(min = std::min(min, f[i - 1][j - C]), a[j]);
    for (int i = 0; i < N; ++i)
        ans = std::min(ans, f[R][i]);

    printf("%d", ans);

    return 0;
}

题解

二分答案+贪心判断 跟前几天那个B......组题几乎一样, 我也几乎一样的不会.

我们二分出每组的最大和, 然后贪心地选出尽量多组数.

C 捡金子

考场没想清楚, 挂了.

题意

题意没说Trie, 但是很明显是Trie.

给出MM个字符串, 每个串在Trie上的节点权值++. 在Trie上选出nn条不相交的链, 问最大权值和是多少.

M50000M \leq 50000, N10N \leq 10

题解

故事就是正解打挂了, 所以标题倔强地写成了题解.

对于每个点, 设fif_i为在它的子树内选了ii条链的最大权值和. 考虑将一棵子树SS并入父亲: 我们从大到小枚举父亲被更新的fif_i, 然后再枚的j(0,i]j \in (0,i], 尝试用fj+S>fijf_j+S->f_{i-j}更新父亲的fif_i. 最后将父亲节点接入链中, 将权值直接加入fif_i中即可. (i[1,N]i \in [1,N])

D 魔术 (附加题)

开场1h后, 比赛描述中出现了这句话:

由于今天的题目过于简单,现为AK或即将AK的同学准备一道附加题。建议在完成前面所有题目之后再来做。不算很难,请同学们放心食用。

Z爷不屑于AB题, 直接切爆CD题QwQ. 而我只苟了ABC, 最后卑微Rank10.

口胡

题意没仔细看, 大概就是会用一种特殊的方法生成边权, 求单源最短路.

评论

0

还没有评论。