cf 321C - Ciel the Commander

题意:给一棵树,树上每个节点随便放置一个A-Z的字幕,A>B>C>....>Z,输出一种放置方案 使得任意两点之间的路径上有一个节点比两个节点的上的字母都大

分析:第二个样例是一个链,给了我灵感,只要找到中间的一个点,然后向两边递减就好了,然后点分治就好了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=1e5+5;
int vis[maxn],n,_min,tsize[maxn],tssize[maxn],root;
int head[maxn],to[maxn*2],edge[maxn*2],tot,dep[maxn],a,b,maxdep;

void init(){
    memset(vis,0,sizeof(vis));
    maxdep=tot=0;
    memset(head,-1,sizeof(head));
}

void addedge(int u,int v){
    edge[tot]=v;
    to[tot]=head[u];
    head[u]=tot++;
}
//获取子树大小和子树的最大值
void getsize(int u,int f){
    tsize[u]=1;tssize[u]=0;
    for(int i=head[u];i!=-1;i=to[i]){
        int v=edge[i];
        if(v==f||vis[v])continue;
        getsize(v,u);
        tsize[u]+=tsize[v];
        tssize[u]=max(tssize[u],tsize[v]);
    }
}
//重心
void getroot(int r,int u,int f){
    tssize[u]=max(tssize[u],tsize[r]-tsize[u]);
    if(tssize[u]<_min)_min=tssize[u],root=u;
    for(int i=head[u];i!=-1;i=to[i]){
        int v=edge[i];
        if(v==f||vis[v])continue;
        getroot(r,v,u);
    }
}

void dfs(int u,int depth){
    _min=n;
    getsize(u,-1);
    getroot(u,u,-1);
    vis[root]=1;
    dep[root]=depth;
    maxdep=max(maxdep,depth);
    int qqq=root;
    for(int i=head[qqq];i!=-1;i=to[i]){
        int v=edge[i];
        if(vis[v])continue;
        dfs(v,depth+1);
    }
}

int main(){
    scanf("%d",&n);
    init();
    for(int i=1;i<n;i++){
        scanf("%d%d",&a,&b);
        addedge(a,b);
        addedge(b,a);
    }
    dfs(1,0);
    if(maxdep>=26){
        puts("Impossible!");
        return 0;
    }
    for(int i=1;i<=n;i++)printf("%c%c",dep[i]+‘A‘,i==n?‘\n‘:‘ ‘);
    return 0;
}
时间: 2024-10-19 19:25:51

cf 321C - Ciel the Commander的相关文章

CodeForces 321C Ciel the Commander

Ciel the Commander Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Original ID: 321C64-bit integer IO format: %I64d      Java class name: (Any) Now Fox Ciel becomes a commander of Tree Land. Tree Land, like its na

Codeforces 321C Ciel the Commander 树分治裸题

题目链接 题意: 给定一棵树,要用字母A-Z 填到每个节点上 字母可以无限使用,但A至多只能用一次 目标:对于任意两个相同字母的节点,他们之间的路径上必须有至少一个节点的字母比他们小 例如:在两个C之间至少要有一个A 或者一个B 问: 输出填涂方案. 树分治即可,最多支持2^25个节点,不会无解. #include <iostream> #include <string> #include <vector> #include <cstring> #inclu

Codeforces G. Ciel the Commander

题目描述: Ciel the Commander time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Now Fox Ciel becomes a commander of Tree Land. Tree Land, like its name said, has n cities connected by n?-?1 undire

微信 {&quot;errcode&quot;:40029,&quot;errmsg&quot;:&quot;invalid code, hints: [ req_id: Cf.y.a0389s108 ]&quot;}

{"errcode":40029,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]"} 问题:微信网页授权后,获取到 openid 了,一刷新又没了 微信网页授权获取到的 code 只能使用一次(5分钟内有效),使用一次后,马上失效. 页面授权跳转成功,根据 code 也换取到 openid 了. 此时刷新页面,并不会再次进行授权,而是直接刷新了一下上一次授权跳转后的链接,带的还是

CF with friends and user&#39;s influence considered on NYC data(updated Aug,11st)

Here is the code link: https://github.com/FassyGit/LightFM_liu/blob/master/U_F1.py I use NYC data as other experimens. The split of the training data was seperated by the timeline, and I have normalised the interaction matrix by replacing the checkin

CF 750

今天CF打的块残废了     就是一废物 A 在24点之前到 直接模拟即可 #include<stdio.h> #include<algorithm> #include<cstring> #include<string> #include<cmath> using namespace std; #define LL long long #define MAXN 1010 #define inf 1000000000.0 int main() {

CF #394 (2) 5/6

Codeforces Round #394 (Div. 2) 总结:有毒的一场比赛.做了三题,结果A被叉,B.C挂综测,还hack失败一发,第一次在CF体会到了-50分的感觉..不知道是不是人品好,比赛时room炸了,然后,unrated.. A  水题,判一下0 0,然后abs(a-b)<=1 B  水题,组个间距比较一下,但一个数的时候要判一下 C  直接暴力上的题 D  也是xjb暴力 题意:给出n,l,r, a[], p[],另有两个数组b[], c[],ci=bi-ai.l<=ai,

一场CF的台前幕后(上)——转

前奏 大约4月份的时候,业界毒瘤pyx噔噔噔跑过来说:“酷爱!我YY了一道题!准备当CF的C” 我当时就被吓傻了."Yet another Chinese round?" “区间取模,区间求和” 感觉这题还不错?不过pyx嫌水了…… 好办!当时我刚刚出完动态仙人掌不久,于是一拍脑袋说:把这个问题出到仙人掌上去! 当然被pyx鄙视了…… 后来一直就没啥动静,直到5月底的CTSC. 试机的时候pyx给我看了套他出的神题……里面有一道题……我不小心读成了下面这个样子: “给定n个m维的模2意

[2016-03-22][CF][69A][Young Physicist]

时间:2016-03-22 19:41:34 星期二 题目编号:[2016-03-22][CF][69A][Young Physicist] 题目大意:判断向量和是否为0 分析:对应坐标相加 遇到的问题:不能用x+y+z来判断是否都为0,除非输入都是正数 #include <cstdio> using namespace std; int main(){ int a,b,c,x,y,z,n; x = y = z = 0; scanf("%d",&n); for(in