Description

Input

Output

对于每组数据,输出一行。若蔬菜的总价能无限制增大,输出"+inf"(不含引号)。否则输出一个整数,表示所有蔬菜的最大总价。
 

首先如果一个非根的点有多个权值不同的孩子,显然答案为+inf,否则为了便于讨论将原树进行一些转换(代码实现中只是隐式处理):

根的权值不会改变,根的子树间互不影响。可以删去根(并计入答案),对每个原先父亲为根的点,新建一个点作为其父亲,权值与根相同(新建的点不计入答案)

叶子的权值不会改变。如果一个点的所有孩子都是叶子,只保留一个孩子(被删去的叶子直接计入答案)

由此得到一个有根森林。对每个连通块,如果每个点至多有一个孩子,构成一条链,那么在链上操作相当于交换相邻两条边的边权(边权定义为两端点权之差),无论如何都无法达到inf,可以贪心将边权排序得到最大值。否则,存在至少一个点有2个或更多孩子,这时当且仅当所有边权相同时答案不是inf(此时操作无效)(若有不同的边权,可通过操作传递至有两个孩子的点上,导致答案为inf(严格的说,不在链上时,操作除了交换两边边权还可能影响其他边权,但并不影响上述结论成立))

#include<cstdio>
#include<algorithm>
int _(){
int x;
scanf("%d",&x);
return x;
}
typedef long long i64;
const int N=,v0=0x3f3f3f3f;
int n;
int fa[N],son[N],v[N],sv[N],deg[N],cl[N];
int ss[N],sp;
bool nl[N];
i64 ans;
#define ass(x) if(x)n/=0
int main(){
//freopen("in.txt","r",stdin);
while(n=_()){
_();
ans=v[]=_();
bool _inf=;
for(int i=;i<=n;++i){
sv[i]=v0;deg[i]=cl[i]=son[i]=;
int f=fa[i]=_();
ass(f>i);
v[i]=_();
if(f==)continue;
++deg[f];
son[f]=i;
if(sv[f]==v0)sv[f]=v[i]-v[fa[i]];
else if(sv[f]!=v[i]-v[fa[i]])_inf=;
}
if(_inf)goto o;
for(int i=;i<=n;++i)if(!deg[i])ans+=v[i],++cl[fa[i]];
//for(int i=2;i<=n;++i)printf("%d:%d %d\n",i,deg[i],cl[i]);
for(int i=;i<=n;++i)nl[i]=nl[fa[i]]||deg[i]-cl[i]-!cl[i]>;
for(int i=n;i>=;--i)nl[fa[i]]|=nl[i];
nl[]=;
for(int i=;i<=n;++i)if(deg[i]){
if(nl[i]){
ans+=v[i];
if(sv[i]!=v[i]-v[fa[i]])goto o;
}else if(fa[i]==){
sp=;
for(int w=i;w;w=son[w])ss[sp++]=v[w]-v[fa[w]];
std::sort(ss,ss+sp);
for(i64 x=v[];sp>;ans+=x+=ss[--sp]);
}
}
printf("%lld\n",ans);
continue;
o:{
puts("+inf");
continue;
}
}
return ;
}

bzoj1825: [JSOI2010]蔬菜庆典的更多相关文章

  1. bzoj 1825: [JSOI2010]蔬菜庆典

    1825: [JSOI2010]蔬菜庆典 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 112  Solved: 45[Submit][Status][ ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 【JSOI2010】Group 部落划分 BZOJ 1821

    1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec  Memory Limit: 64 MB     聪聪研究发现,荒岛野人总是过着群居的生活,但是 ...

  4. Bzoj1823 [JSOI2010]满汉全席

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1640  Solved: 798 Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的 ...

  5. 【BZOJ】1821: [JSOI2010]Group 部落划分 Group(最小生成树+贪心)

    http://www.lydsy.com:808/JudgeOnline/problem.php?id=1821 这题裸题. 本题要求最短距离最长,很明显,我们排序. 这里存在贪心,即我们把边权最小的 ...

  6. 1822: [JSOI2010]Frozen Nova 冷冻波 二分最大流

    1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 585  Solved: 175[Subm ...

  7. BZOJ 2208: [Jsoi2010]连通数 tarjan bitset

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  8. bzoj2208:[Jsoi2010]连通数

    http://blog.csdn.net/u013598409/article/details/47037499 里面似乎有生成数据的... //我本来的想法是tarjan缩点之后然后将图遍历一遍就可 ...

  9. BZOJ_1821_[JSOI2010]_部落划分_(贪心,并查集)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1821 给出n个点的坐标,将n个点划分成k个部分,使得每个部分之间最小的距离最大. 分析 每两个 ...

随机推荐

  1. css 让div 置于最顶层而不被其他东西挡住

    今天遇到自己写的div被其他东西给挡住了,需要设置一个属性就成功了 设置:z-index:值:比如 z-index:999. 若值设置为为-1,代表为最底层. div的图层由div的style中的z- ...

  2. js 怎样获取div 图片等的宽度,只要值,不要px

    给你的div命名id=“abc”,js中用下面的语句就能获取到js的宽度并赋值给a a=document.all.abc.offsetWidth; 然后通过 alert(a); 就能弹出这个值来了.

  3. 2.1 C++类的定义和声明

    参考:http://www.weixueyuan.net/view/6333.html 总结: 类相当于一个新的数据类型,定义类对象时,除了能定义单个变量以外,用类定义一个数组或者指针都是可行的. 在 ...

  4. DevExpress v18.1新版亮点——ASP.NET Bootstrap篇(二)

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress ASP.NET Bootstrap v18.1 的新功能,快 ...

  5. Python学习(001)--计算机基础

    操作系统发展历史 操作系统并不是与计算机硬件一起诞生的,它是在人们使用计算机的过程中,为了满足两大需求:提高资源利用率.增强计算机系统性能,伴随着计算机技术本身及其应用的日益发展,而逐步地形成和完善起 ...

  6. 当前目录如何打开cmd

    前言 有时候需要在当前文件夹打开cmd控制台,直接从开始打开cmd进入当前目录比较麻烦,可以直接进入. 方法 按住键盘上Shift键的同时,在要操作的文件夹(DOS年代称为目录)上点击鼠标右键,在弹出 ...

  7. requests中获取请求到文本编码格式

    1.使用requests模块: import requests 2.通过网络请求,并获取到数据 url = "http://www.stat-nba.com/award/item14.htm ...

  8. 【BZOJ3295】【CQOI2011】动态逆序对

    cdq分治经典例题,然而智商掉线傻逼错误坑了两天 原题: 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你 ...

  9. selinux操作

    setenforce 0 关闭SELinux setenforce 1 临时打开SELinux getenforce 查看SELinux状态 永久关闭SELinux : # cat /etc/seli ...

  10. 彻底删除vscode及安装的插件和个人配置信息

    1.卸载vscode应用软件(在控制面板里面找不到改软件,所以只能进入应用所在文件夹进行卸载) ## 此步骤虽然删掉了应用软件,但是此时重新安装会发现之前下载的插件和个人配置信息都还会重新加载出来,所 ...