题目链接: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. 使用vs2019进行Linux远程开发

    通常,当我们开发Linux程序时有两种方案: 在Linux上直接编写程序并进行运行测试和调试 在Windows或Mac OS X上借助工具进行远程开发 虽然我自己是在Linux环境上直接进行开发的,但 ...

  2. Qt解析CSV文件

    最近需要解析Excel文件,于是顺带写了解析CSV的代码 定义数据类型LX::Sheet #ifndef LX_H #define LX_H #include <QString> #inc ...

  3. HDU5918【KMP大法好,虽然我不会】

    #include <bits/stdc++.h> using namespace std; typedef long long LL; const; int n,m; int a[MAX] ...

  4. jpa使用原生SQL查询数据库like的用法

    jpa使用like查询,需要拼接字符串,如下 oracle用法: //dao层代码 @Query(value = "SELECT * FROM TABLENAME WHERE USER_NA ...

  5. APP为什么会被打回来??

    APP的设置界面, 按钮使用了类似iPhone的操作方式以及icon的圆角设计  ->  重新设计 APP的年龄设置太低  ->  改年龄 APP里有实物奖励  ->  免责声明, ...

  6. 第二十篇 .NET高级技术之C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  7. assembly x86(nasm)选择排序

    有一个首地址为NUM的N字无序无符号整数数组,编制程序采用选择排序法使该数组中的数按照从小到大的次序排序输出. 选择排序: data segment message db 'This is a pro ...

  8. TabBar背景颜色设置

    // 第一种方式 // [[UITabBar appearance] setBarTintColor:[UIColor blackColor]]; // [UITabBar appearance].t ...

  9. insert后面value可控的盲注(第一次代码审计出漏洞)

    这个叫诗龙的cms真的很感谢他的编写人,全站注入~~一些特别白痴的就不说了,这里有一个相对有点意思的 很明显的注入,然后去直接利用报错注入想爆出数据结果发现没有开报错模式. 报错注入http://ww ...

  10. 多线程:『GCD』详尽总结

    本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到:1. GCD 简介2. GCD 任务和队列3. ...