Codeforces Round #453 (Div. 2) a-c

Posted jadelemon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #453 (Div. 2) a-c相关的知识,希望对你有一定的参考价值。

A. Visiting a Friend

水题,但是需要注意段点初,及最后的位置

代码如下:

#include <iostream>
#include <stdio.h>
#include <cmath>
#include <string.h>
#include <algorithm>
using namespace std;
const int N=107;
int dis[N];
struct Node{
    int st,ed;
}a[N];
int cmp(Node c,Node d){
    if(c.ed==d.ed)
        return c.st<d.st;
    return c.ed<d.ed;
}
int main()
{
    int n,m;
    memset(dis,0,sizeof(dis));
    scanf("%d%d",&n,&m);
    int flag=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&a[i].st,&a[i].ed);
        for(int j=a[i].st;!flag&&j<=a[i].ed;j++)
        {
            if(a[i].st&&dis[a[i].st]==0)
                flag=1;
            else
                dis[j]++;
        }
    }
    if(dis[m]==0)
        flag=1;
    if(flag)
        puts("NO");
    else
        puts("YES");
return 0;
}

 

B. Coloring a Tree

额。。。也挺水的,dfs或bfs即可,起点任意一点即可

代码如下:

#include <iostream>
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
const int N=1e4+7;
int vis[N];
vector<int>graph[N];
int c[N];
int res;
void dfs(int r,int cl)
{
    vis[r]=1;
    if(cl!=c[r])res++;
    for(int i=0;i<graph[r].size();i++)
    {
        if(!vis[graph[r][i]])
            dfs(graph[r][i],c[r]);
    }
}
int main()
{
    memset(vis,0,sizeof(vis));
    int n,m,x;
    scanf("%d",&n);
    for(int i=2;i<=n;i++)
    {
        scanf("%d",&x);
        graph[i].push_back(x);
        graph[x].push_back(i);
    }
    for(int i=1;i<=n;i++)
        scanf("%d",&c[i]);
    res=0;
    dfs(1,-1);
    printf("%d\n",res);
    return 0;
}

 

C. Hashing Trees

找到规律,发现当a[i]>1&&a[i-1]>1是该树会出现异构,特判,第一棵树输出在某层的最后一个节点后连所有下一层的节点,以此类推。

找到出现异构的最底层,将这一层的进行修改(将第一个节点连在上一层的倒数第二位置上,其他节点连在上一层的最后位置上),其他层如第一棵树相同。·

 

代码如下:

#include <iostream>
#include <stdio.h>

using namespace std;
const int N=1e5+7;
int main()
{v
    int h;
    int a[N];
    scanf("%d",&h);
    for(int i=0;i<=h;i++)
        scanf("%d",&a[i]);
    int flag=0;
    int hc;
    for(hc=2;!flag&&hc<=h;hc++)
    {
        if(a[hc]>1&&a[hc-1]>1)
        {
            flag=1;
            break;
        }
    }
    if(!flag)
        puts("perfect");
    else
    {
        puts("ambiguous");
        int c=0;
        for(int i=0;i<=h;i++)
        {
                for(int j=1;j<=a[i];j++)
                    printf("%d ",c);
                c+=a[i];
        }
        printf("\n");
        c=0;
        for(int i=0;i<=h;i++)
        {
            if(hc==i)
            {
                for(int j=1;j<=a[i];j++)
                {
                    if(j==1)
                        printf("%d ",c-1);
                    else
                        printf("%d ",c);
                }
            }
            else{
                for(int j=1;j<=a[i];j++)
                    printf("%d ",c);
            }
            c+=a[i];
        }
        printf("\n");
    }
    return 0;
}

 

以上是关于Codeforces Round #453 (Div. 2) a-c的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #453 (Div. 2) a-c

做题Codeforces Round #453 (Div. 1) D. Weighting a Tree——拆环

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

CodeForces 453A 概率题

CodeForces 453A