题目大意

给出一棵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. 字符串的驻留(String Interning)

    http://www.cnblogs.com/artech/archive/2007/03/04/663728.html 关于字符串的驻留的机制,对于那些了解它的人肯定会认为很简单,但是我相信会有很大 ...

  2. javaweb基础(5)_servlet原理

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  3. oracle centos 重启后报错ORA-12514, TNS:listener does not currently know of service requested in connect descriptor

    oracle centos 重启后报错ORA-12514, TNS:listener does not currently know of service requested in connect d ...

  4. 01_8_sql主键生成方式

    01_8_sql主键生成方式 1. 配置映射文件 <insert id="insertStudentBySequence" parameterClass="Stud ...

  5. Linux基础学习-用户的创建修改删除

    用户添加修改删除 1 useradd添加用户 添加一个新用户hehe,指定uid为3000,家目录为/home/haha [root@qdlinux ~]# useradd -u 3000 -d /h ...

  6. 有关Kali的方法

    Kali 找回系统登陆密码的方式:https://jingyan.baidu.com/article/47a29f24560e77c0142399e3.html

  7. navigationcontroller和navigationbar和navigationitem之间的区别以及不用nib实现点击屏幕关闭虚拟键盘20130911

    1.UIViewController UIView的关系. UIView是视图,UIViewController是视图控制器,两者之间是从属关系,当创建一个UIViewController的时候,一般 ...

  8. nmap命令扫描存活主机

    1.ping扫描:扫描192.168.0.0/24网段上有哪些主机是存活的:   [root@laolinux ~]# nmap -sP 192.168.0.0/24 Starting Nmap 4. ...

  9. 如何锁定Android系统CPU的频率

    接触到了Android系统的Performance测试,所以有锁定CPU的需求: 由于要首先读取到此系统所支持的CPU频率,之后再所支持的频率中选取你想要的频率,之后进行锁定. 这个过程,手动也是可以 ...

  10. visual studio 2019安装秘钥

    美国时间4.2微软发布了最新版本的visual studio 2019 现在贴出visual studio2019的秘钥,有需要的请自取: Visual Studio 2019 Enterprise( ...