Codeforces Round #453 (Div. 2)

Codeforces Round #453 (Div. 2)

题目链接:http://codeforces.com/contest/902.

A题题意:每次给X,Y表示可以到达X-Y上的任意点。询问最后是否可以到达终点。

A题题解:将X-Y写成一个前闭后开的区间,将区间的点标记,最后遍历从0-N的所有点,都标记即可到达终点。

AC代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn =107;
 5 int vis[maxn];
 6 int n,m;
 7 int main()
 8 {
 9     cin>>n>>m;
10     for(int i=1;i<=n;i++)
11     {
12         int x,y;
13         cin>>x>>y;
14         for(int i=x;i<y;i++)
15         {
16             vis[i]++;
17         }
18         if(y==m)vis[y]++;
19     }
20     int ok = 0;
21     for(int i=0;i<=m;i++)
22     {
23         if(vis[i]==0)ok = 1;
24     }
25     if(ok)cout<<"NO"<<endl;
26     else cout<<"YES"<<endl;
27 }

B题题意:一棵树有N个节点,下一行是每个结点的父结点。第三行是每个结点应该的涂色,父结点涂色后他的所有子结点都是父结点的颜色,求符合要求的最小次数。

B题题解:贪心的思想,必须从父结点开始涂,然后往下面的子结点走,不相同涂色次数就+1。

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int maxn = 10007;
 5 int fa[maxn],color[maxn],n,x,y;
 6 int main()
 7 {
 8     scanf("%d",&n);
 9     for(int i=2;i<=n;i++)
10     {
11         scanf("%d",&fa[i]);
12     }
13     fa[1]=1;
14     for(int i=1;i<=n;i++)
15     {
16         scanf("%d",&color[i]);
17     }
18     int sum = 1;
19     for(int i=1;i<=n;i++)
20     {
21         if(color[i]!=color[fa[i]])sum++;
22     }
23     cout<<sum<<endl;
24 }

C题题意:给定一棵树的层数和每层的结点数,问是否存在不同的两棵树,存在输出ambiguous和任意两个符合条件的树。

C题题解:容易看出只有有两个连续的层数的结点大于1才能存在不同的树,这个时候输出连续的两层中的第二层父结点和父结点-1即可。

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int maxn = 100007;
 5 int a[maxn];
 6 int n;
 7 int main()
 8 {
 9     scanf("%d",&n);
10     int sum = 0;
11     for(int i=0;i<=n;i++)
12     {
13         cin>>a[i];
14         sum+=a[i];
15     }
16     int k = 0;
17     int ok = 0;
18     int num = 0;
19     for(int i=0;i<=n;i++)
20     {
21         if(a[i]>1)ok++;
22         else ok = 0;
23         if(ok==2)num = i;
24     }
25     if(!num)cout<<"perfect"<<endl;
26     else
27     {
28         cout<<"ambiguous"<<endl;
29         for(int i=0;i<=n;i++)
30         {
31                 for(int j=1;j<=a[i];j++)
32                 {
33                     cout<<k<<" ";
34                 }
35             k+=a[i];
36         }
37         cout<<endl;
38         k = 0;
39         for(int i=0;i<=n;i++)
40         {
41             if(i==num)
42             {
43                 for(int j=1;j<a[i];j++)cout<<k-1<<" ";
44                 cout<<k<<" ";
45             }
46             else
47             {
48                 for(int j=1;j<=a[i];j++)
49                 {
50                     cout<<k<<" ";
51                 }
52             }
53             k+=a[i];
54         }
55         cout<<endl;
56     }
57 }

 

 

 

posted @ 2017-12-23 01:56  sortmin  阅读(144)  评论(0编辑  收藏  举报