题目大意

给出一棵n个结点的有根树,结点用正整数1~n编号。

每个结点有一个1~n的正整数权值,不同结点的权值不相同,

并且一个结点的权值一定比它父结点的权值小(根结点的权值最大,一定是n)。

现在有些结点的权值是已知的,并且如果一个结点的权值已知,它父结点的权值也一定已知。

问还有哪些结点的权值能够唯一确定。

最后输出每个点的全值,不知道输出0

n<=1,000,000

分析

我们求出每个点最大可以是什么权值

如果i点权值<=d,而<=d中的权值已经确定了d-1个,那么i的权值也可以确定

按照贪心,我们从小到大填权值

做法

求每个点最大权值就dfs+二分

后面选数就按权值从小到大扫就可以了

solution

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
const int M=1000007; inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
} int n,rt;
int g[M],te;
struct edge{int y,next;}e[M];
int vis[M];
int val[M];
int pre[M];
int a[M],tot; struct node{
int d,id;
node (int dd=0,int ii=0){d=dd;id=ii;}
}b[M];
int num; bool cmp(node x,node y){return x.d<y.d;} void addedge(int x,int y){
e[++te].y=y;e[te].next=g[x];g[x]=te;
} int find(int d){
int l=1,r=tot,mid;
while(l<r){
int mid=(l+r)/2+1;
if(a[mid]>=d) r=mid-1;
else l=mid;
}
return a[l];
} void dfs(int x,int mx){
if(val[x]) mx=val[x];
else {
mx=find(mx);
b[++num]=node(mx,x);
}
int p,y;
for(p=g[x];p;p=e[p].next)
if((y=e[p].y)!=pre[x]){
dfs(y,mx);
}
} int main(){
int i,j,x,y,z;
n=rd();
for(i=1;i<=n;i++){
y=rd(),z=rd();
if(i==y) rt=i;
else pre[i]=y,addedge(y,i);
val[i]=z;
vis[z]=1;
} for(i=1;i<=n;i++)
if(!vis[i]) a[++tot]=i; dfs(rt,n); sort(b+1,b+num+1,cmp); int cnt=0;
j=1;
for(i=1;i<=n;i++){
if(vis[i]){
cnt++;
continue;
}
if(b[j].d==i){
int tp=j;
for(;j<=num&&b[j].d==i;j++);
if(cnt==i-1) val[b[j-1].id]=i;
cnt+=j-tp;
}
} for(i=1;i<=n;i++) printf("%d\n",val[i]); return 0;
}

bzoj 2799 [Poi2012]Salaries 性质+二分的更多相关文章

  1. bzoj 2792: [Poi2012]Well【二分+贪心】

    #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const ...

  2. [BZOJ2799][Poi2012]Salaries

    2799: [Poi2012]Salaries Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 91  Solved: 54[Submit][Statu ...

  3. 题解:POI2012 Salaries

    题解:POI2012 Salaries Description The Byteotian Software Corporation (BSC) has \(n\) employees. In BSC ...

  4. 【BZOJ2799】[Poi2012]Salaries 乱搞

    [BZOJ2799][Poi2012]Salaries Description 给出一棵n个结点的有根树,结点用正整数1~n编号.每个结点有一个1~n的正整数权值,不同结点的权值不相同,并且一个结点的 ...

  5. bzoj 2803 [POI2012]prefixuffix hsh+性质

    题目大意 bzoj 2803 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串abbaab是循环相同的. 给出一个长度为n的串S,求满 ...

  6. BZOJ 2792 Poi2012 Well 二分答案

    题目大意:给定一个非负整数序列A.每次操作能够选择一个数然后减掉1,要求进行不超过m次操作使得存在一个Ak=0且max{Ai−Ai+1}最小,输出这个最小值以及此时最小的k 二分答案,然后验证的时候首 ...

  7. bzoj 2792 [Poi2012]Well 二分+dp+two_pointer

    题目大意 给出n个正整数X1,X2,...Xn,可以进行不超过m次操作,每次操作选择一个非零的Xi,并将它减一. 最终要求存在某个k满足Xk=0,并且z=max{|Xi - Xi+1|}最小. 输出最 ...

  8. [BZOJ 1816] [Cqoi2010] 扑克牌 【二分答案】

    题目链接:BZOJ - 1816 题目分析 答案具有可以二分的性质,所以可以二分答案. 验证一个答案 x 是否可行,就累加一下各种牌相对于 x 还缺少的量,如果总和超过了 x 或 m ,就不可行. 因 ...

  9. Bzoj 4371: [IOI2015]sorting排序 二分

    题目 似乎很久没写题解了... 这题是校里胡策的时候的题,比赛因为评测机有点慢+自己代码常数大没快读...被卡t了,但是bzoj上还是A了的...,因为bzoj时限比较宽可以不卡常. 题解: 首先可以 ...

随机推荐

  1. SCOPE_IDENTITY和@@IDENTITY[转]

    本文转自:http://www.cnblogs.com/daydayupanan/archive/2008/09/04/1283648.html SCOPE_IDENTITY和@@IDENTITY的作 ...

  2. c++作业:递归调用,例题4.5 求第五个人的年龄

    递归调用,例题4.5 求第五个人的年龄 #include <iostream> using namespace std; int age(int num){ int a; ) a=; el ...

  3. #ifdef #else #endif #fi #ifndef 的用法

    预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作.说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译.这样做的好处是,经过处理后的代码,将会变的很精短.   ...

  4. OpenCV3.42+VS2017配置+模块计算机类型“X86”与目标计算机类型“x64”冲突”的问题解决

    目录 OpenCV3.42+VS2017配置 Visual Studio 2017 第三方依赖设置,附加依赖项和附加库目录 "fatal error LNK1112: 模块计算机类型&quo ...

  5. 简单的C++ DLL注入

    今天呢,我们来讨论一下用C++实现DLL注入的简单方法. 环境: Visual Studio 2015及以上 Windows 7及以上 入门需要了解的: DLL是什么:DLL_360百科 DLL是Dy ...

  6. centos启动流程

    centos6启动流程 1.主板,post加电自检,检查硬件环境 2.主板选择一个硬盘进行引导,执行mbr446 grub stage1 3.grub stage1.5 加载/boot分区文件系统驱动 ...

  7. composer安装laravel-u-editor及其使用

    前言  使用的框架是laravel5.1,是composer搭建的,可以直接配置composer,如果不是composer搭建的larave,需要先安装composer,具体安装发放可以参考compo ...

  8. 《Java并发编程实战》读书笔记一 -- 简介

    <Java并发编程实战>读书笔记一 -- 简介 并发的历史 并发的历史,也是人类利用有限的资源去提高生产效率的一个的例子. 设想现在有台计算机,这台计算机具有以下的资源: 单核CPU一个 ...

  9. LeetCode(219) Contains Duplicate II

    题目 Given an array of integers and an integer k, find out whether there are two distinct indices i an ...

  10. 二叉排序树:HDU3791-二叉搜索树(用指针建立二叉排序树)

    二叉搜索树 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Descr ...