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; }