JZOJ5776 小x游世界树

Description

小x得到了一个小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当他想前往阿瓦隆时发现那里只有圣诞节时才能到达,然而现在已经春天了,不甘心的他将自己的目的地改成了世界树,他耗费了大量的时间,终于将自己传送到了世界树下。世界树是一棵非常巨大的树,它有着许许多多的枝条以及节点,每个节点上都有一个平台。好不容易来到传说中的世界树下,小x当然要爬上去看看风景。小x每经过一条边都会耗费体力值。然而世界树之主想给他弄(gáo)些(dǐan)麻(shì)烦(qíng),于是他在每条边上都设了一个魔法阵,当小x踏上那条边时会被传送回根节点,魔法阵只生效一次。这岂不是要累死小x?幸运的是,每个平台上都有无数个加速器,这些加速器可以让小x在当前节点所连的边上耗费的体力值减少,不同平台的加速器性能不一定相同,但同一个平台的加速器性能绝对相同。世界树之主给了小x一次“换根”的机会,他可以将世界树的任何一个节点变为根,但所有的边都不能改变。小x想问你,将根换为哪个节点能使小x爬到世界树上的每个节点耗费的体力值和最少。默认编号为1的点为初始根。

Input

  第一行一个数n,表示有n个节点。
  第二行n个数ai,表示每个平台上的加速器的性能。
  第三至n+1行,每行三个数bi,ci,di分别表示这条无向边的起点,终点与耗费的能量值

Output

  第一行一个数,表示要换成的节点,如果有多个点为根时耗费的体力值都最小,则输出编号最小的那个。如果保持为1是最优的,就输出1。
  第二行一个数,表示最小耗费的体力值。

Sample Input

  4
  2 1 3 3
  1 2 3
  1 3 4
  2 4 6

Sample Output

  1
  9

Data Constraint

  对于20%的数据:n<=100
  对于40%的数据:n<=1000
  对于60%的数据:n<=8000
  对于80%的数据:n<=100000
  对于100%的数据:0<n<=700000;ai<=1000;1<=bi,ci<=n;di<=1000。
  数据保证一个点的加速器性能绝对小于等于它的所有的边所耗费的能量,保证所有节点都可以到达,保证没有数据与样例相同。

Solution

  首先暴力算出一个以某个节点为根所需的能量,然后从这个点在dfs一次,推导出以其他n个点为根所需能量。

 1 #include <cstdio>
 2 using namespace std;
 3 struct arr
 4 {
 5     int x,y,next;
 6     long long w;
 7 };
 8 arr edge[2000000];
 9 int ls[1000000],n,p[1000000],son[1000000],e;
10 long long s[1000000],minn;
11 bool f[1000000];
12 int dfs(int x)
13 {
14     int i=ls[x];
15     son[x]=1;
16     while (i!=0)
17     {
18         if (f[edge[i].y])
19         {
20             f[edge[i].y]=false;
21             dfs(edge[i].y);
22             son[x]=son[x]+son[edge[i].y];
23             s[x]=s[x]+s[edge[i].y]+(edge[i].w-p[x])*(son[edge[i].y]);
24         }
25         i=edge[i].next;
26     }
27 }
28 int bdfs(int x)
29 {
30     int i=ls[x];
31     while (i!=0)
32     {
33         if (f[edge[i].y])
34         {
35             int k=edge[i].y;
36             s[k]=s[x]-(edge[i].w-p[x])*(son[k]);
37             s[k]=s[k]+(edge[i].w-p[k])*(n-son[k]);
38             if (s[k]<minn||s[k]==minn&&k<e)
39             {
40                 minn=s[k];
41                 e=k;
42             }
43             f[k]=false;
44             bdfs(k);
45         }
46         i=edge[i].next;
47     }
48 }
49 int main()
50 {
51     scanf("%d",&n);
52     for (int i=1;i<=n;i++)
53         scanf("%d",&p[i]);
54     for (int i=1;i<=n-1;i++)
55     {
56         scanf("%d%d%d",&edge[i*2-1].x,&edge[i*2-1].y,&edge[i*2-1].w);
57         edge[i*2-1].next=ls[edge[i*2-1].x];
58         ls[edge[i*2-1].x]=i*2-1;
59         edge[i*2].x=edge[i*2-1].y;
60         edge[i*2].y=edge[i*2-1].x;
61         edge[i*2].w=edge[i*2-1].w;
62         edge[i*2].next=ls[edge[i*2].x];
63         ls[edge[i*2].x]=i*2;
64     }
65     for (int i=1;i<=n;i++)
66         f[i]=true;
67     f[1]=false;
68     dfs(1);
69     for (int i=1;i<=n;i++)
70         f[i]=true;
71     f[1]=false;
72     minn=s[1];
73     e=1;
74     bdfs(1);
75     printf("%d\n",e);
76     printf("%lld\n",minn);
77 }

原文地址:https://www.cnblogs.com/Tokisaki-Kurumi/p/9477968.html

时间: 2024-10-11 00:40:18

JZOJ5776 小x游世界树的相关文章

不知哪个OJ 小x游世界树 换根?不知。

小x游世界树 (yggdrasi.pas/c/cpp) [问题描述] 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当他想前往阿瓦隆时发现那里只有圣诞节时才能到达,然而现在已经春天了,不甘心的他将自己的目的地改成了世界树,他耗费了大量的时间,终于将自己传送到了世界树下.世界树是一棵非常巨大的树,它有着许许多多的枝条以及节点,每个节点上都有一个平台.好不容易来到传说中的世界树下,小x当然要爬上去看看风景.小x每经过一条边都

小x游世界树

题源 Input 7 7 8 1 3 2 5 2 4 6 5 6 1 8 1 2 9 5 4 3 3 4 10 3 7 4 Output 1 24 一看就知道是个什么套路 记录每个点的siz , dis.在父子节点间考虑转移. 然后搞了个代码,过了个极水的样例 1 #include<stdio.h> 2 #define For(i,a,b) for(register int i=(a);i<=(b);i++) 3 using namespace std; 4 const int maxn

JZ模拟赛 8.9

B组: T1: 农夫约的假期 Description: 在某国有一个叫农夫约的人,他养了很多羊,其中有两头名叫mm和hh,他们的歌声十分好听,被当地人称为"魔音"······  农夫约也有自己的假期呀!他要去海边度假,然而mm和hh不能离开他.没办法,他只好把他们两个带上.  到了海边,农夫约把他的羊放在一个(n*n)的矩阵(有n*n个方格)里.mm和hh十分好动,他们要走到m(m<=n*n)个地方,第i个地方的坐标为(x[i](行),y[i](列)),每到一个地方他们会高歌一曲

北京周末游周边 —— 东小口森林公园

?从地图上看东小口森林公园紧挨着奥林匹克森林公园北侧,面积甚至不比奥森小,但实际上可供居民游玩的地方只有三分之一不到(图中黄色部分). 小北游当年是从西北门进入的,一进门就感觉这个公园跟奥森完全不是一个级别的,奥森属于国家级公园,这个公园顶多算是县级公园,甚至对于北京来说是乡镇级也不为过.从上图可以看出周边建设非常荒. 这个公园完全作为周边居民的休闲公园,很少有像小北游这样的游客不顾其偏僻而特意来游览.而且小北游游历一番后发现西北门相当不便,东门和东南门是居民小区所以散步居民稍多一些,西北门没有

NOI2017游记

Day -1: THUSC后,下定决心好好学习,不过由于自制力太弱,还是没有忍住浪了几次. 老师把NOI前的天分为了4种:考试日.交流日.讲课日.自习日. 考试日是我被郭神短神妖神任神常神尹神龙神游神柴神聪神和20亿个蒟蒻们虐的日子,成功让我认清自己是个垃圾的事实. 老师选了51nod上一堆题分派给大家,然后在交流日里讲,分给我的题是2道码农题和一道水题,除了郭神的一道题太神了没做外,其他人的题我都做了. 讲课日是老师请了各种大佬来讲课,基本全程都是郭神与大佬谈笑风生,其他人懵逼,大佬一般都会说

棉花与棉被

棉花与棉被 我本想写一篇广告,但是却因为要卖的东西而触发了我的一些思绪,要卖的不是什么产品,只是几床棉被.不为赚钱,只为帮助几个 种了棉花,却卖不出去的棉农.新闻联播经常说中国地大物博,各种粮食作物,经济作物产量几何, 却很少说丰收了,却卖不出去,苦了农民. 从我这一代再往上的人,都应该有一个棉被情节,在我们小时候还没有那么多花哨的被子. 我生长在东北的农村,而且是一个偏远的山沟,大概在91年左右,我们的小山村里才第一次迎来电灯. 说我家境贫寒,有点矫情,因为那时候大家(我的周围)都一样,所有人

2014年发生的一些事情

2014年对于自己来说,真是不平凡的一年,达成了年初制定的计划,可是也发生了很多意想不到的事情! 大概在十月份作用的时候,离开了自己待了两年多的公司. 在公司的这两年,自己从一个小职员成长到技术经理.这两年真是毕业之后自己成长的两年,开发了两款游戏,推上线一款,同时负责收购了一款游戏.推上线的那款游戏,我们封测了两次,最后一次稳定之后,才安稳的推上线.想想每次封测的时候,都要熬夜,到现在我不在公司了,几个同事可以安稳的开新服,合服,我想我对于公司的责任也尽到了,只是游戏不赚钱,而且在与策划的争吵

5年开发不如新人,反例何其多,望君惜前路

最怕不过是不知道到自己想要什么,又无法安心做好眼下的事,最后一无所获.-洛夫斯基.小作 小作,90后,高中毕业后,在三本与职业培训中抉择,最终进入了IT行业名声相当不好的培训机构. 两年不到的培训时间,三个学期,近四万的学费,学习了网页制作,数据库操作,C#,JAVA等相关技术. 毕业季,小作陆续参加学校推荐的几个公司面试,有包吃住远在郊区工厂的2k的工作,有各种外包公司2k5,3k的工作,有各种校友创业开的小公司. 最后选择了一家规模不到20人的旅游系统公司,不包吃不包住,月薪3k,就这样开启

月光下的凤尾竹—彩云之南西双版纳游记

一.写在游记之前 今天距离汶川大地震已整整10年,依然记得10年之前,我刚下完课走回寝室的路上,一瞬间脚下的地面开始震动,骚动的叫声此起彼伏.地震,就这么毫无征兆地来了,距离我那么近.幸运的是,我没有受伤.不幸的是,汶川的人民们受伤了,他们失去了家园,也失去了部分亲人.2008年512大地震,总计造成约45万人伤亡,近2万人失踪,是建国以来破坏力最大的地震,也是唐山大地震后伤亡最严重的一次地震. 10年已经过去,现在的汶川也已经在废墟中发展起来,曾经的废墟之上,城乡面貌发生巨变,百姓安居乐业,处