[BZOJ2799][Poi2012]Salaries
2799: [Poi2012]Salaries
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 91 Solved: 54
[Submit][Status][Discuss]
Description
给出一棵n个结点的有根树,结点用正整数1~n编号。
每个结点有一个1~n的正整数权值,不同结点的权值不相同,
并且一个结点的权值一定比它父结点的权值大(根结点的权值最大,一定是n)。
现在有些结点的权值是已知的,并且如果一个结点的权值已知,它父结点的权值也一定已知。
问还有哪些结点的权值能够唯一确定。
Input
第一行一个正整数n (n<=1,000,000),表示树的结点数。
下面共n行,第i行描述编号为i的结点,每行两个整数pi,zi (1<=pi<=n, 0<=zi<=n)。
pi表示结点i的父结点,如果i=pi,说明i是根结点。
当zi>0时,表示结点i的权值已知,并且就是zi;当zi=0时,表示结点i的权值未知。
测试数据保证满足题意,并且存在合法的方案。
Output
输出共n行,依次描述每个结点。如果结点i的权值能够唯一确定,第i行输出结点i的权值,否则第i行输出0。
Sample Input
2 2
2 10
1 0
2 9
2 5
4 0
6 0
6 0
5 0
5 0
Sample Output
2
10
1
9
5
8
0
0
0
0
HINT
Source
dfs可以求出每个点最大可能是多少。
然后就变成个一个填数问题。
如果$只有一个i,max_i=k$,且1~k之间只剩下了一个数,$v_i=k$
如果$max_i<=k$的数正好填满1~k则清空1~k。
#include<cstdio>
#define N 1000010
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,v[N],f[N],fa[N],mx[N];
inline int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
int num[N],id[N],all,sum[N];
void dfs(int x)
{
if(mx[x])return;
dfs(fa[x]);
mx[x]=find(mx[fa[x]]-);
if(++num[mx[x]]==)
id[mx[x]]=x;
}
int main()
{
n=read();
for(int i=;i<=n;i++)f[i]=i;
for(int i=;i<=n;i++)
{
fa[i]=read();
v[i]=read();
if(fa[i]==i)v[i]=n;
if(v[i])f[v[i]]=v[i]-,mx[i]=v[i];
}
for(int i=;i<=n;i++)
if(!mx[i])dfs(i);
for(int i=;i<=n;i++)
sum[i]=sum[i-]+(f[i]==i);
for(int i=;i<=n;i++)if(num[i])
{
if(num[i]==&&sum[i]==all+)
v[id[i]]=i,all++;
else if(num[i]+all==sum[i])
all=sum[i];
else num[i+]+=num[i];
}
for(int i=;i<=n;i++)
printf("%d\n",v[i]);
}
[BZOJ2799][Poi2012]Salaries的更多相关文章
- 【BZOJ2799】[Poi2012]Salaries 乱搞
[BZOJ2799][Poi2012]Salaries Description 给出一棵n个结点的有根树,结点用正整数1~n编号.每个结点有一个1~n的正整数权值,不同结点的权值不相同,并且一个结点的 ...
- 题解:POI2012 Salaries
题解:POI2012 Salaries Description The Byteotian Software Corporation (BSC) has \(n\) employees. In BSC ...
- [POI2012]Salaries
题目大意: 给定一棵n带权树,每个点的权值在[1,n]范围内且互不相等,并满足子结点的权值一定小于父结点. 现在已知一个包含根结点的联通块中个点的权值,求剩下哪些点的权值能够被求出,并求出这些权值. ...
- bzoj 2799 [Poi2012]Salaries 性质+二分
题目大意 给出一棵n个结点的有根树,结点用正整数1~n编号. 每个结点有一个1~n的正整数权值,不同结点的权值不相同, 并且一个结点的权值一定比它父结点的权值小(根结点的权值最大,一定是n). 现在有 ...
- POI2012题解
POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [LeetCode] Department Top Three Salaries 系里前三高薪水
The Employee table holds all employees. Every employee has an Id, and there is also a column for the ...
- 2795: [Poi2012]A Horrible Poem
2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 484 Solved: 235[Subm ...
- [BZOJ2803][Poi2012]Prefixuffix
2803: [Poi2012]Prefixuffix Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 219 Solved: 95[Submit][St ...
随机推荐
- POJ3208 Apocalypse Someday(二分 数位DP)
数位DP加二分 //数位dp,dfs记忆化搜索 #include<iostream> #include<cstdio> #include<cstring> usin ...
- 数据结构之图 Part3 – 1 遍历
DFS using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
- jquery获取、改变元素属性值
//标签的属性称作元素属性,在JS里对应的DOM对象的对应属性叫DOM属性.JS里的DOM属性名有时和原元素属性名不同. //==================================操作元 ...
- C/C++面试题
第一部分:基本概念及其它问答题 1. 关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量 ...
- linux command file/type which/whereis
今天遇到几个命令,初见时感觉好像啊,不太能区分其具体功能和区别,因此特来记录一下. 1. file和type file: 查看文件类型 type: display information of com ...
- C字符数组赋值(转)
举例如下: char a[10];1.定义的时候直接用字符串赋值char a[10]="hello";注意:不能先定义再给它赋值,如 char a[10]; a[10]=" ...
- AngularJS - 指令入门
指令,我将其理解为AngularJS操作HTML element的一种途径. 由于学习AngularJS的第一步就是写内置指令ng-app以指出该节点是应用的根节点,所以指令早已不陌生. 这篇日志简单 ...
- JQuery 操作对象的属性值
通过JQuery去操作前台对象(div,span...)的属性是很常见的事情,本文就简单的介绍几种操作情形. 1):通过属性值去获取对象 2):用JQuery去修改对象的属性值 3):获取并修改对象的 ...
- 【rqnoj28】[Stupid]愚蠢的宠物
题目描述 背景 大家都知道,sheep有两只可爱的宠物(一只叫神牛,一只叫神菜).有一天,sheep带着两只宠物到狗狗家时,这两只可爱的宠物竟然迷路了…… 描述 狗狗的家因为常常遭到猫猫的攻击,所以不 ...
- MyBatis入门案例 增删改查
一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...