HDU3887 Counting Offspring [2017年6月计划 树上问题03]

Counting Offspring

Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2809    Accepted Submission(s): 981

Problem Description

You
are given a tree, it’s root is p, and the node is numbered from 1 to n.
Now define f(i) as the number of nodes whose number is less than i in
all the succeeding nodes of node i. Now we need to calculate f(i) for
any possible i.

Input

Multiple cases (no more than 10), for each case:
The first line contains two integers n (0<n<=10^5) and p, representing this tree has n nodes, its root is p.
Following n-1 lines, each line has two integers, representing an edge in this tree.
The input terminates with two zeros.

Output

For each test case, output n integer in one line representing f(1), f(2) … f(n), separated by a space.

Sample Input

15 7
7 10
7 1
7 9
7 3
7 4
10 14
14 2
14 13
9 11
9 6
6 5
6 8
3 15
3 12
0 0

Sample Output

0 0 0 0 0 1 6 0 3 1 0 0 0 2 0

Author

bnugong

Source

2011 Multi-University Training Contest 5 - Host by BNU

Recommend

lcy   |   We have carefully selected several similar problems for you:  3450 1166 3030 1541 3743

//====================================

被格式错误卡了半个小时

开始多了空格,去了空格,不对

后来发现多组数据要加空行,然后在数据之间加了空行,不对

看了看题解才发现末尾要多一个空行

竟无语凝噎

//====================================

跟树状数组求逆序对的思想类似,大家可以去看那一道题的思路

#include <bits/stdc++.h>

inline void read(int &x)
{
	char ch = getchar();char c = ch;x = 0;
	while(ch < ‘0‘ || ch > ‘9‘)c = ch, ch = getchar();
	while(ch <= ‘9‘ && ch >= ‘0‘)x = x * 10 + ch - ‘0‘, ch = getchar();
	if(c == ‘-‘)x = -x;
}
inline int lowbit(int &a){return a & (-a);}
const int MAXN = 500000 + 10;

int n,root,tmp1,tmp2;

struct Edge{int u,v,next;}edge[MAXN << 1];
int head[MAXN], cnt, l[MAXN << 1], r[MAXN << 1], bit[MAXN << 1];
inline void insert(int a, int b){edge[++cnt] = Edge{a,b,head[a]};head[a] = cnt;}
int b[MAXN], stack[MAXN], top, rank;

void dfs(int root)
{
	register int u,v,pos;
	stack[++top] = root;
	b[root] = 1;
	while(top)
	{
		u = stack[top--];
		if(l[u])
		{
			r[u] = ++rank;
			continue;
		}
		stack[++top] = u;
		l[u] = ++rank;
		for(pos = head[u];pos;pos = edge[pos].next)
		{
			v = edge[pos].v;
			if(b[v])continue;
			b[v] = true;
			stack[++top] = v;
		}
	}
}

inline void modify(int p, int k)
{
	register int tmp = n << 1;
	for(;p <= tmp;p += lowbit(p))
		bit[p] += k;
}

inline int ask(int p)
{
	register int ans = 0;
	for(;p;p -= lowbit(p))
		ans += bit[p];
	return ans;
}

bool ok;
int main()
{
	while(true)
	{
		read(n);read(root);
		if(!(n || root))break;
		memset(edge, 0, sizeof(edge));
		memset(head, 0, sizeof(head));
		memset(l, 0, sizeof(l));
		memset(r, 0, sizeof(r));
		cnt = 0;
		memset(bit, 0, sizeof(bit));
		memset(b, 0, sizeof(b));
		memset(stack, 0, sizeof(stack));
		top = 0;
		rank = 0;
		register int i;
		for(i = 1;i < n;++ i)
		{
			read(tmp1);read(tmp2);
			insert(tmp1, tmp2);
			insert(tmp2, tmp1);
		}
		dfs(root);
		printf("%d", ask(r[1]) - ask(l[1] - 1));
		modify(l[1], 1);
		for(i = 2;i <= n;i ++)
		{
			printf(" %d", ask(r[i]) - ask(l[i] - 1));
			modify(l[i], 1);
		}
		printf("\n");
	}
	return 0;
}
时间: 2024-10-13 01:51:21

HDU3887 Counting Offspring [2017年6月计划 树上问题03]的相关文章

洛谷P1774 最接近神的人_NOI导刊2010提高(02) [2017年6月计划 线段树03]

P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的遗产了.但现在的问题是如何打开这扇门…… 仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的.而最聪明的人往往通过一种仪式选拔出来.仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即

ZOJ3195 Design the city [2017年6月计划 树上问题04]

Design the city Time Limit: 1 Second      Memory Limit: 32768 KB Cerror is the mayor of city HangZhou. As you may know, the traffic system of this city is so terrible, that there are traffic jams everywhere. Now, Cerror finds out that the main reason

洛谷P3459 [POI2007]MEG-Megalopolis [2017年6月计划 树上问题02]

[POI2007]MEG-Megalopolis 题目描述 Byteotia has been eventually touched by globalisation, and so has Byteasar the Postman, who once roamedthe country lanes amidst sleepy hamlets and who now dashes down the motorways. But it is those strolls inthe days of

[Hdu3887]Counting Offspring

[Hdu3887]Counting OffspringYou are given a tree, it’s root is p, and the node is numbered from 1 to n. Now define f(i) as the number of nodes whose number is less than i in all the succeeding nodes of node i. Now we need to calculate f(i) for any pos

2017年7月计划

6月的最后一天,我完成了六月计划,打卡 7月07日~14日将在郑州河南省实验度过 7月15日~22日将在济南清北学堂度过 7月25日~8月2日将在日照一中度过 8月05日~11日将在青岛二中度过 于是...定下如下计划: 1.动态规划百题斩开启  难度在提高及以上.100道题, 包括: 状压DP                                    15道 区间DP                                    10道 树上DP 10道 数位DP 10道

RQNOJ PID192 梦幻大PK [2017年6月计划 二分图02]

PID192 / 梦幻大PK ☆ 提交你的代码 查看讨论和题解 你还木有做过哦 我的状态 查看最后一次评测记录 质量 7 题目评价 质量 7 ★★★★★ ★★★★☆ ★★★☆☆ ★★☆☆☆ ★☆☆☆☆ 50% 0% 25% 0% 25% ★ ★ ★ ★ ☆ 通过人数 754 / 2273 通过统计 最短耗时 0ms 最小内存 0KB 匹配 题目标签 类型 匹配 题目描述 难得到了生日,正逢上班里面一年一度的梦幻大PK,分2组对拼.但是由于某种原因,参加PK的第1组中有些人不能和第2组人PK.可能

【计划】2017年5月计划

由于上次计划制定时已经是月中了,弄得有点多,削减了一点. 从清北回来,最后一次借着众dalao意外失利,我接近AK了(有一个数据点有点小问题,拿了290分),小激动,愈发砥砺前行. 1.完成四月计划(5.11日) 2.清北学堂Day1题目(18日) 3.清北学堂Day2题目(25日) 4.清北学堂Day3题目(30日) 嗯..总之先这样 还剩Day4和Day5,争取下次去清北前搞完吧 Day6一天可完,上午数论,下午AK(逃)  DayNOIP原题,打算以后抽个时间集中做一下 就这样.

洛谷P2723 丑数 Humble Numbers [2017年 6月计划 数论07]

P2723 丑数 Humble Numbers 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包括,p1.p1*p2.p1*p1.p1*p2*p3...(还有其 它).该集合被称为S集合的“丑数集合”.注意:我们认为1不是一个丑数. 题目描述 你的工作是对于输入的集合S去寻找“丑数集合”中的第N个“丑数”.所有答案可以用longint(32位整数)存储. 补充:丑数集合中每个数从小到大排列,每个丑

洛谷P1062 数列 [2017年6月计划 数论03]

P1062 数列 题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,…) 请你求出这个序列的第N项的值(用10进制数表示). 例如,对于k=3,N=100,正确答案应该是981. 输入输出格式 输入格式: 输入文件只有1行,为2个正整数,用一个空格隔开