小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=7e5+10;
 5 int n,a[maxn],head[maxn],cnt,siz[maxn],dis[maxn],ans=1;
 6 long long del[maxn],tot;
 7 struct Edge{
 8     int v,nxt,w;
 9 }edge[maxn<<1];
10 inline void add(int u,int v,int w){
11     edge[++cnt].v=v,edge[cnt].w=w,edge[cnt].nxt=head[u],head[u]=cnt;
12 }
13 inline void pre(int p,int fa){
14     siz[p]=1,tot+=dis[p];
15     for(int i=head[p];i;i=edge[i].nxt){
16         int v=edge[i].v;if(v==fa) continue;
17         dis[v]=dis[p]+edge[i].w;
18         pre(v,p);siz[p]+=siz[v];
19     }
20 }
21 inline void dfs(int p,int fa){
22     for(int i=head[p];i;i=edge[i].nxt){
23         int v=edge[i].v;if(v==fa) continue;
24         del[v]=del[fa]+(n-siz[v])*edge[i].w-siz[v]*edge[i^1].w;
25         dfs(v,p);
26     }
27 }
28 signed main(){
29     scanf("%d",&n);
30     For(i,1,n) scanf("%d",&a[i]);
31     For(i,2,n){
32         int b,c,d;scanf("%d%d%d",&b,&c,&d);
33         add(b,c,d-a[b]),add(c,b,d-a[c]);
34     }
35     pre(1,1);
36     dfs(1,1);
37     For(i,1,n){
38         if(del[i]<del[ans]) ans=i;
39     }
40     printf("%d %d\n",ans,tot+del[ans]);
41 }

然后爆0。比如上面那个数据就没过去。

发现算法没错。

int cnt;

从零开始的cnt竟然用^1来搞反向边,我……

然后再来一发,爆了int

呃呃呃我开了long long啊

printf("%d %d\n",ans,del[ans]);

改成lld, A了,我……

 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=7e5+10;
 5 int n,a[maxn],head[maxn],cnt=1,siz[maxn],ans=1;
 6 long long dis[maxn],del[maxn];
 7 struct Edge{
 8     int v,nxt,w;
 9 }edge[maxn<<1];
10 inline void add(int u,int v,int w){
11     edge[++cnt].v=v,edge[cnt].w=w,edge[cnt].nxt=head[u],head[u]=cnt;
12 }
13 inline void pre(int p,int fa){
14     siz[p]=1,del[1]+=dis[p];
15     for(int i=head[p];i;i=edge[i].nxt){
16         int v=edge[i].v;if(v==fa) continue;
17         dis[v]=dis[p]+edge[i].w;
18         pre(v,p);
19         siz[p]+=siz[v];
20     }
21 }
22 inline void dfs(int p,int fa){
23     for(int i=head[p];i;i=edge[i].nxt){
24         int v=edge[i].v;if(v==fa) continue;
25         del[v]=del[p]+(n-siz[v])*edge[i^1].w-(siz[v])*edge[i].w;
26         dfs(v,p);
27     }
28 }
29 signed main(){
30     scanf("%d",&n);
31     For(i,1,n) scanf("%d",&a[i]);
32     For(i,2,n){
33         int b,c,d;scanf("%d%d%d",&b,&c,&d);
34         add(b,c,d-a[b]),add(c,b,d-a[c]);
35     }
36     pre(1,1);
37     dfs(1,1);
38     For(i,1,n){
39         if(del[i]<del[ans]) ans=i;
40     }
41     printf("%lld %lld\n",ans,del[ans]);
42 }

发现能A的和原来没有多大差别

我是沙雕

原文地址:https://www.cnblogs.com/monyhzc/p/12193651.html

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

小x游世界树的相关文章

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

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

JZOJ5776 小x游世界树

Description 小x得到了一个小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当他想前往阿瓦隆时发现那里只有圣诞节时才能到达,然而现在已经春天了,不甘心的他将自己的目的地改成了世界树,他耗费了大量的时间,终于将自己传送到了世界树下.世界树是一棵非常巨大的树,它有着许许多多的枝条以及节点,每个节点上都有一个平台.好不容易来到传说中的世界树下,小x当然要爬上去看看风景.小x每经过一条边都会耗费体力值.然而世界树之主想给他弄(gáo)些(dǐan

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年已经过去,现在的汶川也已经在废墟中发展起来,曾经的废墟之上,城乡面貌发生巨变,百姓安居乐业,处