对于每一个节点查询,他的所有的叶子节点之差最小的值
先对叶子建立set然后向上递归启发式合并,并在合并同时更新值就可以了
507. Treediff
Time limit per test: 0.5 second(s)
Memory limit: 262144 kilobytes
Memory limit: 262144 kilobytes
input: standard
output: standard
output: standard
Andrew has just made a breakthrough in complexity theory: he thinks that he can prove P =NP if he can get a data structure which allows to perform the following operation quickly. Naturally, you should help him complete his brilliant research. Consider a rooted tree with integers written in the leaves. For each internal (non-leaf) node v of the tree you must compute the minimum absolute difference between all pairs of numbers written in the leaves of the subtree rooted at v .
Input
The first line of the input file contains two integers
n
and
m
— overall number of nodes in the tree and number of leaves in the tree respectively.
![](https://i-blog.csdnimg.cn/blog_migrate/e5ec3a980823550c92fd17ae87e5b45d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0b610887d7538cccd29a1a1e6dddaa55.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3ccb2210355d754e152ee25f696c6b0f.png)
Output
Output one line with
n
-
m
integers: for each internal node of the tree output the minimum absolute difference between pairs of values written in the leaves of its subtree. If there is only one leaf in the subtree of some internal node, output number 2
31
- 1 for that node. Output the answers for the nodes in order from node number 1 to
n
-
m
.
Example(s)
sample input | sample output |
5 4 1 1 1 1 1 4 7 9 | 2 |
sample input | sample output |
5 4 1 1 1 1 1 4 7 10 | 3 |
sample input | sample output |
7 4 1 2 1 2 3 3 2 10 7 15 | 3 3 8 |
sample input | sample output |
2 1 1 100 | 2147483647 |
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#include<iterator>
#include<vector>
using namespace std;
#define INF 2147483647
#define pb push_back
#define MAXN 50100
vector<int> g[MAXN];
set<int> s[MAXN];
set<int>::iterator si,pre,suc;
int v[MAXN];
int n,m;
int merge(set<int> &x,set<int> &y)
{
if(x.size()<y.size()) swap(x,y);
int tmp=INF;
for(si=y.begin();si!=y.end();si++)
{
pre=suc=x.lower_bound(*si);
if(pre!=x.begin()) pre--;
if(pre!=x.end()) tmp=min(tmp,abs(*si-*pre));
if(suc!=x.end()) tmp=min(tmp,abs(*si-*suc));
x.insert(*si);
}
return tmp;
}
void dfs(int u)
{
if(!g[u].size())
{
s[u].insert(v[u]);
v[u]=INF;
return;
}
v[u]=INF;
for(int i=0;i<g[u].size();i++)
{
int vv=g[u][i];
dfs(vv);
v[u]=min(v[u],v[vv]);
v[u]=min(v[u],merge(s[u],s[vv]));
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
{
g[i].clear();
s[i].clear();
}
for(int i=2;i<=n;i++)
{
int f;
scanf("%d",&f);
g[f].pb(i);
}
for(int i=n-m+1;i<=n;i++) scanf("%d",&v[i]);
dfs(1);
printf("%d",v[1]);
for(int i=2;i<=n-m;i++)
printf(" %d",v[i]);
printf("\n");
}
return 0;
}