• Codeforces Round #453 Div. 2 A B C D (暂时)


    // 从大作业和实验报告中爬出来水一发

    // 补题...还是得排在写完实验报告之后...

    A. Visiting a Friend

    题意

    给定若干段行车区间,问能否从起点到终点

    思路

    扫描一遍,维护最远的终点

    Code

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    int x[110], y[110];
    int main() {
        int n, m;
        scanf("%d%d", &n, &m);
        int endd = 0;
        for (int i = 0; i < n; ++i) {
            scanf("%d%d", &x[i], &y[i]);
        }
        for (int i = 0; i < n; ++i) {
            if (x[i] > endd) { puts("NO"); return 0; }
            endd = max(endd, y[i]);
        }
        if (endd >= m) puts("YES");
        else puts("NO");
        return 0;
    }
    
    

    B. Coloring a Tree

    题意

    给定一棵树,起始时所有点的颜色为(0).
    现对该树染色,规则为:对某个点染色,则会对以它为根的整棵子树染色。
    给定最终各点的颜色,问至少染色了多少次。

    思路

    注意到,题目虽然是说对某个点染色会对其整棵子树产生影响,但事实上只需要考虑该点的直接子女即可。

    对于点(u)的子女点(v)
    如果(c_u与c_v)不同,则染色数+1;此时(u)(v)的子树没有影响;
    否则,染色数不变;并且可认为(v)代表(u)存在,即将(u)的影响延续了下去。

    故只需要考虑每个点的直接子女即可。

    直接(bfs)一遍。

    Code

    #include <bits/stdc++.h>
    #define maxn 100010
    using namespace std;
    typedef long long LL;
    struct Edge {
        int to, ne;
    }edge[maxn];
    int c[maxn], p[maxn], n, tot, ne[maxn];
    void add(int u, int v) {
        edge[tot] = {v, ne[u]};
        ne[u] = tot++;
    }
    int ans;
    queue<int> q;
    void bfs(int src) {
        while (!q.empty()) q.pop();
        q.push(src);
        ans = 1;
        while (!q.empty()) {
            int u = q.front(); q.pop();
            for (int i = ne[u]; ~i; i = edge[i].ne) {
                int v = edge[i].to;
                if (c[u] != c[v]) ++ans;
                q.push(v);
            }
        }
    }
    int main() {
        tot = 0; memset(ne, -1, sizeof ne);
        scanf("%d", &n);
        for (int i = 2; i <= n; ++i) {
            scanf("%d", &p[i]);
            add(p[i], i);
        }
        for (int i = 1; i <= n; ++i) scanf("%d", &c[i]);
        bfs(1);
        printf("%d
    ", ans);
        return 0;
    }
    
    

    C. Hashing Trees

    题意

    给定一棵树各个深度的节点个数,问在同构意义下该树是否唯一。
    若不唯一,给出两种表示。

    思路

    唯一(longleftrightarrow)不存在相邻的两层节点数都大于1,显然

    构造:

    1. 将每一层的所有节点挂在上一层的第一个节点下
    2. 对于相邻两层节点都大于1的两层,将第下一层的最后一个节点挂在上一层的第二个节点下,其余都挂在第一个节点下。
    #include <bits/stdc++.h>
    #define maxn 200010
    using namespace std;
    int fa[maxn], fa2[maxn], a[maxn];
    typedef long long LL;
    int main() {
        int h;
        scanf("%d", &h);
        for (int i = 0; i <= h; ++i) scanf("%d", &a[i]);
        if (h == 1) { puts("perfect"); return 0; }
        bool flag = true;
        for (int i = 1; i < h; ++i) {
            if (a[i]>=2 && a[i+1]>=2) {
                flag = false;
                break;
            }
        }
        if (flag) { puts("perfect"); return 0; }
        puts("ambiguous");
        int tot = 0, f = 0;
        fa[tot++] = f++;
        for (int i = 1; i <= h; ++i) {
            for (int j = 0; j < a[i]; ++j) fa[tot++] = f;
            f += a[i-1];
        }
        int tot2 = 0; f = 0;
        fa2[tot2++] = f++;
        for (int i = 1; i <= h; ++i) {
            if (a[i] > 1 && a[i-1] > 1) {
                for (int j = 0; j < a[i]-1; ++j) fa2[tot2++] = f;
                fa2[tot2++] = ++f;
                f += a[i-1]-1;
            }
            else {
                for (int j = 0; j < a[i]; ++j) fa2[tot2++] = f;
                f += a[i-1];
            }
        }
        printf("%d", fa[0]);
        for (int i = 1; i < tot; ++i) printf(" %d", fa[i]); puts("");
        printf("%d", fa2[0]);
        for (int i = 1; i < tot2; ++i) printf(" %d", fa2[i]); puts("");
    
        return 0;
    }
    
    

    D. GCD of Polynomials

    题意

    对于两个多项式(A(x)=sum_{i=1}^{n}a_ix^i)(B(x)=sum_{i=1}^{m}b_ix^i),有$$A(x)=B(x)cdot D(x)+R(x),deg R(x)lt deg B(x)$$则记(A(x)mod B(x)=R(x)).

    根据欧几里得算法有$$GCD(A(x),B(x))=GCD(B(x),A(x)mod B(x))$$经过若干次操作可以得到最终的(GCD)值。

    现给出操作次数(n),要求构造出符合要求的(A(x))(B(x)),要求为每一项的系数绝对值小于等于(1),且最高项系数为(1).

    思路

    (P_n(x)=P_{n-1}(x)*xpm P_{n-2}(x))

    注意:只要求最后结果的最高项为1,而对中间过程没有要求!
    // 看到题解后昨晚(P_n(x)=pm P_{n-1}(x)*x+P_{n-2}(x))的我眼泪掉下来(并不

    Code

    #include <bits/stdc++.h>
    #define maxn 1010
    using namespace std;
    typedef long long LL;
    int a[maxn], b[maxn], temp[maxn];
    int main() {
        int n;
        scanf("%d", &n);
        a[0] = 1; b[0] = 0; b[1] = 1;
        int l1 = 1, l2 = 2;
        for (int i = 1; i < n; ++i) {
            temp[0] = 0;
            for (int j = 0; j < l2; ++j) temp[j+1] = b[j];
            bool flag = true;
            for (int j = 0; j < l1; ++j) {
                temp[j] += a[j];
                if (abs(temp[j]) > 1) { flag = false; break; }
            }
            if (!flag) {
                temp[0] = 0;
                for (int j = 0; j < l2; ++j) temp[j+1] = b[j];
                for (int j = 0; j < l1; ++j) temp[j] -= a[j];
            }
            swap(a, b);
            swap(b, temp);
            ++l1, ++l2;
        }
        printf("%d
    %d", l2-1, b[0]);
        for (int i = 1; i < l2; ++i) printf(" %d", b[i]); puts("");
        printf("%d
    %d", l1-1, a[0]);
        for (int i = 1; i < l1; ++i) printf(" %d", a[i]); puts("");
        return 0;
    }
    
    

    小总结

    这次还是比较顺利的,分别在4min, 16min, 46min的时候过了A, B, C,并且做B题的时候直觉挺不错

    当时看D才过了个位数就不怎么想做了,然后慢慢悠悠吃东西看题目看看板看看room...

    后来觉得D可做写了一发然后发现不太对,便继续挂机准备睡觉了...实际上是完全可做的

    这不行啊,终极目的还是提高啊

    这样说的我却还不积极补题,噫吁嚱

  • 相关阅读:
    Spring MVC系列之Hello World(SpringBoot)(六)
    SpringBoot系列之注解@Autowired VS @Qualifier VS @Primary(五)
    SpringBoot系列之注解@Component VS @Bean(四)
    SpringBoot系列之@PropertySource和@Value注解(二)
    SpringBoot系列之入门篇(一)
    不要叫我,我会叫你(控制反转原理)
    EntityFramework Core 3多次Include导致查询性能低之解决方案
    EntityFramework Core 3.0查询
    Java入门系列之集合HashMap源码分析(十四)
    浅析性能测试策略及适用场景
  • 原文地址:https://www.cnblogs.com/kkkkahlua/p/8069970.html
Copyright © 2020-2023  润新知