1. 程式人生 > >Codeforces Round #453 (Div. 2) a-c

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

!= force gpo n) return sizeof size nod amp

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