题目链接:http://codeforces.com/gym/100650

根据给出的树和d,求出一些结点,这些结点形成子树的第d层结点数应该尽量多,具体要求可以参考题目。

dfs一个结点前保存询问深度的答案,访问完以后减去之前的值就得到答案了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = ; vector<string> names;
map<string,int> mp;
int id_cnt;
#define se second
#define MP make_pair int ID(const string & s){
map<string,int>::iterator i = mp.find(s);
if(i != mp.end()) return i->se;
names.push_back(s);
mp.insert(MP(s,id_cnt));
return id_cnt++;
}
int deg[maxn];
int head[maxn],nxt[maxn],to[maxn],ecnt; void addEdge(int u,int v)
{
to[ecnt] = v;
nxt[ecnt] = head[u];
head[u] = ecnt++;
} int pre[maxn*];
int cnt[maxn*];
int deep[maxn]; struct Node
{
int d,id;
bool operator < (const Node & x) const {
return d < x.d || ( d == x.d && names[id] > names[x.id] );
}
}; priority_queue<Node> q; int n,d;
void dfs(int u)
{
cnt[deep[u]]++;
int qd = deep[u]+d;
if(qd < maxn) pre[u] = cnt[qd];
for(int i = head[u]; ~i; i = nxt[i]){
int v = to[i];
deep[v] = deep[u]+;
dfs(v);
}
if(qd<maxn){
int ans = cnt[qd]-pre[u];
if(ans) q.push(Node{ans,u});
}
} void init()
{
names.clear();
mp.clear();
id_cnt = ;
ecnt = ;
memset(deg,,sizeof(deg));
memset(head,-,sizeof(head));
memset(cnt,,sizeof(cnt));
while(q.size()) q.pop();
} char str[]; void read()
{
scanf("%d%d",&n,&d);
while(n--){
int ch; scanf("%s%d",str,&ch);
int fa = ID(str);
while(ch--){
scanf("%s",str);
int v = ID(str);
deg[v]++;
addEdge(fa,v);
}
}
} void topo()
{
int root;
n = mp.size();
for(int i = ; i < n; i++){
if(deg[i] == ) { root = i; break; }
}
deep[root] = ;
dfs(root);
} int main()
{
//freopen("in.txt","r",stdin);
int T; scanf("%d",&T);
for(int kas = ; kas <= T; kas++){
init();
read();
topo();
printf("Tree %d:\n",kas);
for(int i = ; i <= ; i++){
if(q.empty()) break;
Node x = q.top(); q.pop();
printf("%s %d\n",names[x.id].c_str(),x.d);
if(i == ){
int pre = x.d;
while(q.size()){
x = q.top(); q.pop();
if(x.d == pre){
printf("%s %d\n",names[x.id].c_str(),x.d);
}else {
break;
}
}
}
}
if(kas != T) putchar('\n');
}
return ;
}

Codeforces Gym 100650B Countdown (离线)的更多相关文章

  1. Codeforces Gym 100650B Countdown DFS

    Problem B: CountdownTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/conte ...

  2. Codeforces Gym 101252D&&floyd判圈算法学习笔记

    一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...

  3. Codeforces Gym 101190M Mole Tunnels - 费用流

    题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...

  4. Codeforces Gym 101623A - 动态规划

    题目传送门 传送门 题目大意 给定一个长度为$n$的序列,要求划分成最少的段数,然后将这些段排序使得新序列单调不减. 考虑将相邻的相等的数缩成一个数. 假设没有分成了$n$段,考虑最少能够减少多少划分 ...

  5. 【Codeforces Gym 100725K】Key Insertion

    Codeforces Gym 100725K 题意:给定一个初始全0的序列,然后给\(n\)个查询,每一次调用\(Insert(L_i,i)\),其中\(Insert(L,K)\)表示在第L位插入K, ...

  6. Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】

     2017 JUST Programming Contest 2.0 题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2 J. Hu ...

  7. codeforces gym 100553I

    codeforces gym 100553I solution 令a[i]表示位置i的船的编号 研究可以发现,应是从中间开始,往两边跳.... 于是就是一个点往两边的最长下降子序列之和减一 魔改树状数 ...

  8. CodeForces Gym 100213F Counterfeit Money

    CodeForces Gym题目页面传送门 有\(1\)个\(n1\times m1\)的字符矩阵\(a\)和\(1\)个\(n2\times m2\)的字符矩阵\(b\),求\(a,b\)的最大公共 ...

  9. Codeforces GYM 100876 J - Buying roads 题解

    Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...

随机推荐

  1. 1.13-1.14 Hive Action

    一.Hive Action 1.创建文件 [root@hadoop-senior oozie-apps]# pwd /opt/cdh-5.3.6/oozie-4.0.0-cdh5.3.6/oozie- ...

  2. 51nod - 1363 - 最小公倍数之和 - 数论

    https://www.51nod.com/Challenge/Problem.html#!#problemId=1363 求\(\sum\limits_{i=1}^{n}lcm(i,n)\) 先换成 ...

  3. iOS 8 之后的动态沙盒路径

    在iOS8之前,我们获取到沙盒中的document.cache.tmp之后,下一次模拟器或真机无论重启多少次,这具体的路径是固定的,可是iOS8 之后,你要是在按原来的路径去找你想要的东西,我想它会把 ...

  4. atcoder#073D(枚舉)

    題目鏈接: http://arc073.contest.atcoder.jp/tasks/arc073_b 題意: 給出n, m兩個數, n是物品數目, m是背包容量, 接下來n行輸入, wi, vi ...

  5. mybatis-trim标签说明

    trim标签使用1.trim 有四个属性 2.prefix,suffix 表示在trim标签包裹的部分的前面或者后面添加内容(注意:是没有prefixOverrides,suffixOverrides ...

  6. IP服务-5-网络时间协议

    NTP版本3(RFC1305)允许IP主机向一个通用的时钟源同步它们的日期和时间. 从设计上来说,大多数路由器和交换机都使用NTP客户端模式,根据NTP服务器所提供的时间来调整自己的时钟.NTP定义了 ...

  7. socket编程模拟linux下的ssh代码实现

    实现思路: 1.提供输入指令的客户端: 2.提供返回执行指令结果的服务端 3.寻找服务端返回结果一次无法全部接收的解决思路 服务端代码(ssh_server.py) #coding=utf-8 imp ...

  8. [題解](最小生成樹/LCA)luogu_P1967貨車運輸

    一道好題不出所料又抄的題解 1.首先對於這張圖肯定要考慮走哪些邊不走哪些邊,發現我們想要的肯定那些邊權最大的邊,所以想到最大生成樹 這樣能保證選到盡量大的邊 2.跑完最大生成樹后每兩點之間就有唯一路徑 ...

  9. windows下写的shell脚本到linux上不能运行

    win上是dos模式,需要改成unix模式 方法是: 在linux上vim 打开脚本,然后:set ff=unix

  10. TCP常用方法

    //格式化为16进制输出指令 function fromateSendCode($code){ $codeArr = getCodeWithSpace($code); for($i=0; $i< ...