[POI2012]Salaries
题目大意:
给定一棵n带权树,每个点的权值在[1,n]范围内且互不相等,并满足子结点的权值一定小于父结点。
现在已知一个包含根结点的联通块中个点的权值,求剩下哪些点的权值能够被求出,并求出这些权值。
思路:
贪心。
很显然,对于某一个结点x,如果当前只有一个可取的权值w,且小于其父结点的权值,那么这个结点的权值一定是w。
事实上所有未知结点权值都可以尝试用这样的方法得出,关键是如何唯一确定下这个权值w。
我们可以用一个数组max记录每个结点权值的上界,再用一个数组last记录小于某个权值能取的最大权值。
max数组可以用一趟DFS递归出来。
然后顺序枚举每一个权值,如果可用就加入到一个“黑箱”中,如果现在黑箱中只有一个权值w并且有未知权值的结点,说明这个节点的权值就是w。
然后如果现在黑箱中有多个权值,未知的结点也很多,那么这些权值就作废。
#include<cstdio>
#include<cctype>
#include<vector>
inline int getint() {
char ch;
while(!isdigit(ch=getchar()));
int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int V=;
std::vector<int> c[V];
int n;
int w[V],s[V],par[V],max[V],cnt[V],last[V],root;
int find(const int x) {
return x==last[x]?x:last[x]=find(last[x]);
}
void dfs(const int x) {
if(!max[x]) {
max[x]=find(max[par[x]]-);
s[max[x]]=x;
cnt[max[x]]++;
}
for(unsigned i=;i<c[x].size();i++) {
dfs(c[x][i]);
}
}
int main() {
n=getint();
for(int i=;i<=n;i++) last[i]=i;
for(int i=;i<=n;i++) {
int p=getint();
w[i]=max[i]=getint();
if(p!=i) {
c[p].push_back(i);
par[i]=p;
} else {
root=i;
w[i]=n;
}
last[w[i]]=w[i]-;
}
dfs(root);
for(int i=,tmp=;i<=n;i++) {
if(last[i]==i) tmp++;
if(cnt[i]&&tmp==) w[s[i]]=i;
tmp-=cnt[i];
}
for(int i=;i<=n;i++) printf("%d\n",w[i]);
return ;
}
[POI2012]Salaries的更多相关文章
- [BZOJ2799][Poi2012]Salaries
2799: [Poi2012]Salaries Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 91 Solved: 54[Submit][Statu ...
- 【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 ...
- 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 ...
随机推荐
- 10 Useeful Tips for Writing Effective Bash Scripts in Linux
1.Always Use Comments in Scripts2.Make a Scripts exit When Fails Sometimes bash may continue to e ...
- Html5使用history对象history.pushState()和history.replaceState()方法添加和修改浏览历史记录
根据网上参考自己做个笔记:参考网址:http://javascript.ruanyifeng.com/bom/history.html history.pushState() HTML5为histor ...
- ProtocolBuffer 使用及 一些坑
Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储.通信协议等方面. ProtocolBuffer的优势 跨平台: Prot ...
- 两个Bounding Box的IOU计算代码
Bounding Box的数据结构为(xmin,ymin,xmax,ymax) 输入:box1,box2 输出:IOU值 import numpy as np def iou(box1,box2): ...
- php环境搭建 (window环境下 eclipse+Wampserver)
看了好多的环境搭建感觉好复杂呀,自己搞了一下简单的可以用了 php的手册 http://www.php.net/manual/zh/ 一,下载 1,下载eclipse http://www.ecl ...
- 3->集群架构主机克隆教程
centos7系统集群主机克隆: 有道笔记链接地址
- sql的主键,int类型,自增,自动编号到了规定最大数,接下来数据库会怎么做
答案:它会从1开始重新编号,但是避开已经重复的值.
- Eclipse中各种编码格式及设置
操作系统:Windows 10(家庭中文版) Eclipse版本:Version: Oxygen.1a Release (4.7.1a) 刚看到一篇文章,里面介绍说Ascii.Unicode是编码,而 ...
- 栈应用之 后缀表达式计算 (python 版)
栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1. 中缀表达式.前缀表达式.后缀表达式区别 中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...
- Python 常用的内建函数
内建函数 Build-in Function,启动python解释器,输入dir(__builtins__), 可以看到很多python解释器启动后默认加载的属性和函数,这些函数称之为内建函数, ...