bzoj 1825: [JSOI2010]蔬菜庆典
1825: [JSOI2010]蔬菜庆典
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 112 Solved: 45
[Submit][Status][Discuss]
Description

Input

Output
Sample Input
-1 3
1 2
1 1
3 2
3 2
5
-1 3
1 2
1 1
3 2
3 3
0
Sample Output
+inf
HINT

简化版题意:
给出一棵有根树,每个点有一个权值v,可以对一个有父亲并且又有儿子的节点选择一个儿子进行一次操作使$v[x]=v[fa[x]]+v[son[x]]-v[x]$。
问无限制使用这种操作后树上的权值和最大为多少。
参照样例,显然当某一时刻一个非根节点有两个不同权值的儿子时答案就是正无穷。
假设这个点的权值为A,父亲为B,权值小的孩子为C,大的为D。
第一次 A'=(B+C-A) 第二次 A''=B+D-A'=B+D-B-C+A=A+D-C>A
然后考虑怎么构造出这种情况。
因为根节点是不会变的,所以对于1的每一个儿子可以分开处理,设为函数solve(x)。
如果某个点有两个儿子不同那么就不需要构造直接返回inf。
如果每个点的$v[fa[x]]+v[son[x]]$都等于$2v[x]$显然这棵树的权值是固定的,返回整棵树的权值。
那么现在存在一个点$v[fa[x]]+v[son[x]]!=2[v[x]]$,这个点的权值可以变化,那么说明这棵树的非叶节点的权值都可以变化(递归考虑,一个点的权值要么本身就能变化,那么它父亲或儿子变化后它可以变化),此时如果答案不为inf,这棵树只能是一条链,或者链上的最后一个点可以有多个叶儿子。
两种情况没有区别,考虑一条链怎么做。
不妨让它长这样:
....A B C.....
对B操作,我们从两个视角看:
A: B'=A+(C-B)
C: B'=C-(B-A)
B'-A=(C-B)
C-B'=(B-A)
其实就是差分序列的相邻两项交换了位置。
然后做法就很明了了。。。
为了让和尽量大,我们把差分序列排个序就好啦>_<
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 200005
#define int long long
#define inf 0x3f3f3f3f
using namespace std;
int head[N],ver[N],nxt[N],tot;
int son[N];
void add(int a,int b)
{
tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;return ;
}
int n;
int p[N],v[N];
bool flag,lian,flag2,flag3;
int sum[N],ss;
void dfs(int x)
{
int pre=inf;
if(!head[x])ss+=v[x];
if(p[x]!=1&&son[x]!=0&&son[p[x]]>=2)flag3=1;
for(int i=head[x];i;i=nxt[i])
{
if(son[x]>1)lian=1;
if(pre!=inf&&v[ver[i]]!=pre)flag=1;
if(v[p[x]]+v[ver[i]]!=2*v[x])flag2=1;
pre=v[ver[i]];
dfs(ver[i]);
sum[x]+=sum[ver[i]];
}
sum[x]+=v[x];
return ;
}
int st[N],top;
bool cmp(int x,int y)
{
return x>y;
}
int solve(int x)
{
flag=0;lian=0;flag2=0;flag3=0;ss=0;
dfs(x);
if(flag||(lian&&flag2&&flag3))return 0;
if(lian&&flag3)return sum[x];
top=0;
for(int i=x;;i=ver[head[i]])
{
st[++top]=v[i]-v[p[i]];
if(!head[i])break;
}
sort(st+1,st+top+1,cmp);
int now=v[1];
int sm=0;
for(int i=1;i<top;i++)
{
now+=st[i];
sm+=now;
}
return sm+ss;
}
signed main()
{
while(~scanf("%lld",&n))
{
if(n==0)break;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&p[i],&v[i]);
if(p[i]!=-1)add(p[i],i),son[p[i]]++;
}
int ans=0,ts=0;
for(int i=head[1];i;i=nxt[i])
{
int tmp=solve(ver[i]);
if(flag||(lian&&flag2&&flag3))ts=1;
ans+=tmp;
}
if(ts)puts("+inf");
else printf("%lld\n",ans+v[1]);
tot=0;
for(int i=1;i<=n;i++)head[i]=sum[i]=p[i]=v[i]=son[i]=0;
}
return 0;
}
bzoj 1825: [JSOI2010]蔬菜庆典的更多相关文章
- bzoj1825: [JSOI2010]蔬菜庆典
Description Input Output 对于每组数据,输出一行.若蔬菜的总价能无限制增大,输出"+inf"(不含引号).否则输出一个整数,表示所有蔬菜的最大总价. 首 ...
- BZOJ 2208: [Jsoi2010]连通数 tarjan bitset
2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 2208: [Jsoi2010]连通数( DFS )
n只有2000,直接DFS就可以过了... -------------------------------------------------------------------------- #in ...
- BZOJ 1820: [JSOI2010]Express Service 快递服务( dp )
dp(i,j,k)表示在处理第i个业务, 另外2个在j,k处. 第一维可以滚动... --------------------------------------------------------- ...
- BZOJ 1823: [JSOI2010]满汉全席( 2-sat )
2-sat...假如一个评委喜好的2样中..其中一样没做, 那另一样就一定要做, 这样去建图..然后跑tarjan. 时间复杂度O((n+m)*K) ------------------------- ...
- bzoj 2208 [Jsoi2010]连通数
2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 512 MB Description Input 输入数据第一行是图顶点的数量,一个正整数N ...
- 【刷题】BZOJ 4946 [Noi2017]蔬菜
Description http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf Solution 网上大部分都是并查集写法,但是有大神写了非并查集写 ...
- BZOJ.4946.[NOI2017]蔬菜(贪心 离线)
题目链接 因为有删除,考虑倒序处理某个p的询问. 那么每天删除xi的蔬菜就变成了每天运来xi的蔬菜.那么我们取当前最优的即可,早取晚取都一样,不需要留给后面取,还能给后面更优的留出空间. 这样就只需考 ...
- bzoj 1823: [JSOI2010]满汉全席 && bzoj 2199 : [Usaco2011 Jan]奶牛议会 2-sat
noip之前学的内容了,看到题竟然忘了怎么建图了,复习一下. 2-sat 大概是对于每个元素,它有0和1两种选择,必须选一个但不能同时选.这之间又有一些二元关系,比如x&y=1等等... 先把 ...
随机推荐
- DP使用GUI推送WIN客户端是报110:1022错误的解决办法
在使用GUI推送WIN客户端时,输入用户名和密码后报错: [Critical 110::1022] Cannot connect to the SCM (Service Control Manage ...
- ACM中常见错误提示解析
Output Limit Exceeded 多数发生在递归遍历的过程中,多输出了一些内容(比如说空格).Output Limit Exceeded还指如果输入某一组数据,你的程序返回的结果是一直输出某 ...
- Node.js开发入门—套接字(socket)编程
Node.js的net模块提供了socket编程接口,方便我们利用较为底层的套接字接口来实现应用协议.这次我们看一个简单的回显服务器示例,包括服务端和客户端的代码. 代码 分服务器和客户端两部分来说吧 ...
- MySQL原生API、MySQLi面向过程、MySQLi面向对象、PDO操作MySQL
[转载]http://www.cnblogs.com/52fhy/p/5352304.html 本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对 ...
- web07-jdbcBookStore
新建web项目,名字 新建servlet,名字CreateDBServlet 内容为: ---- 配置web.xml 数据库的URL.driveclass.user.passWord都写在web.xm ...
- IO异常 的处理 test
package com.throwsss; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFou ...
- 软工1816 · Beta冲刺(1/7)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 完成beta冲刺阶段的任务安排 整理博客 接下来的计划 & 还剩下哪些 ...
- POJ 2104 K-th Number 主席树(区间第k大)
题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...
- 如何:通过将HTML编码应用于字符串来防止Web应用程序中的脚本漏洞
当用户可以将可执行代码(或脚本)添加到您的应用程序中时,会发生大多数脚本攻击.默认情况下,ASP.NET提供请求验证,如果表单发布包含任何HTML,则会引发错误. 您可以通过以下方式帮助防止脚本漏洞利 ...
- Unity如何判断网络状态?
根据Application.internetReachability来判断网络状态 NetworkReachability.NotReachable 网络不可用 NetworkReachability ...