题目链接: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. Volley(一)

    为什么使用Volley Android提供了两个HTTP库给开发者来进行实现一个HTTP请求,一个是AndroidHttpClient (从apache HttpClient拓展而来),另一个是Htt ...

  2. swift日期操作

    简介:本文将介绍一些关于swift中对于日期的格式化与获取,支持swift4.0 extension Date { //格式化日期 func getDateString() -> String{ ...

  3. Weekly Contest 111-------->943. Find the Shortest Superstring(can't understand)

    Given an array A of strings, find any smallest string that contains each string in A as a substring. ...

  4. POJ3191【(-2)进制本质】

    题意: 实现10进制数转换成-2进制数 思路: 有点意思,先扯些题外话,一个我们经常做的二进制:利用二进制有好多优化,大多都是利用了二进制能够表示一个数,然后优化了空间或者时间. 所以问题很清楚啊,就 ...

  5. Codeforces712C【贪心】

    看了这篇.. http://blog.csdn.net/queuelovestack/article/details/52503162 直接就是从小到大,那么每次按最大的递增顺序上去,就是了. 因为每 ...

  6. VR头盔产品镜片评测

    2015-07-21 16:59 原创 Randy Orton http://www.leiphone.com/news/201507/7j46BjWsSitKML13.html 虚拟现实设备自从去年 ...

  7. uoj#79. 一般图最大匹配(带花树)

    传送门 带花树 不加证明的说一下过程好了:每次从一个未匹配点\(S\)出发bfs,设\(S\)为\(1\)类点,如果当前点\(v\)在本次bfs中未经过,分为以下两种情况 1.\(v\)是未匹配点,那 ...

  8. 在指定的ChartArea中显示Series

    WinForm的Chart有Series, ChartArea,输出图表就往Serie里扔数据就可以了,很方便是吧.我原想Area和serie有上下级关系,可是我错了,Area和Serie并没有上下级 ...

  9. C 语言实例 - 输出当前文件执行代码

    C 语言实例 - 输出当前文件执行代码 输出当前文件执行代码,__FILE__ 为当前执行的文件常量. 实例 #include <stdio.h> int main() { FILE *f ...

  10. C 语言实例 - 将字符串写入文件

    C 语言实例 - 将字符串写入文件 C 语言实例 C 语言实例 将字符串写入文件. 实例 #include <stdio.h> #include <stdlib.h> /* e ...