NOI2003 逃学的小孩

这一题不会做啊……

我觉得真要比赛的话我可能会随机上几万次,然后再用LCA求距离,更新最优值,等到快超时的时候输出答案……

题解请看2007年陈瑜希论文

代码:

 1 const maxn=400100;
2 type node=record
3 w,go,next:longint;
4 end;
5 var e:array[0..maxn] of node;
6 f:array[0..maxn,1..3] of int64;
7 first,u:array[0..maxn] of longint;
8 i,x,y,z,n,tot,m:longint;
9 ans:int64;
10 function max(x,y:int64):int64;
11 begin
12 if x>y then exit(x) else exit(y);
13 end;
14 function get(x,y,z:int64):int64;
15 begin
16 get:=x+2*y+z;
17 end;
18 procedure insert(x,y,z:longint);
19 begin
20 inc(tot);e[tot].go:=y;e[tot].w:=z;e[tot].next:=first[x];first[x]:=tot;
21 end;
22 procedure init;
23 begin
24 readln(n,m);
25 for i:=1 to m do
26 begin
27 readln(x,y,z);
28 insert(x,y,z);
29 insert(y,x,z);
30 end;
31 end;
32 procedure update(x,y:int64);
33 begin
34 if y>f[x,1] then
35 begin
36 f[x,3]:=f[x,2];
37 f[x,2]:=f[x,1];
38 f[x,1]:=y;
39 end
40 else
41 if y>f[x,2] then
42 begin
43 f[x,3]:=f[x,2];
44 f[x,2]:=y;
45 end
46 else
47 f[x,3]:=max(f[x,3],y);
48 end;
49 procedure dfs1(x,fa:longint);
50 var i,y:longint;
51 begin
52 i:=first[x];
53 while i<>0 do
54 begin
55 y:=e[i].go;
56 if y<>fa then
57 begin
58 dfs1(y,x);
59 u[y]:=e[i].w;
60 update(x,f[y,1]+u[y]);
61 end;
62 i:=e[i].next;
63 end;
64 end;
65 procedure dfs2(x,fa:longint);
66 var i,y:longint;
67 begin
68 if f[x,1]+u[x]=f[fa,1] then update(x,f[fa,2]+u[x])
69 else update(x,f[fa,1]+u[x]);
70 ans:=max(ans,get(f[x,1],f[x,2],f[x,3]));
71 i:=first[x];
72 while i<>0 do
73 begin
74 y:=e[i].go;
75 if y<>fa then dfs2(y,x);
76 i:=e[i].next;
77 end;
78 end;
79 procedure main;
80 begin
81 ans:=0;
82 dfs1(1,0);
83 dfs2(1,0);
84 writeln(ans);
85 end;
86 begin
87 init;
88 main;
89 end.

唉,这种神题,我什么时候才能自己想到呢?

NOI2003 逃学的小孩,布布扣,bubuko.com

时间: 2024-10-15 08:57:22

NOI2003 逃学的小孩的相关文章

1509: [NOI2003]逃学的小孩 - BZOJ

Description Input 第一行是两个整数N(3 ? N ? 200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1?Ui, Vi ? N,1 ? Ti ? 1000000000),表示街道i连接居住点Ui和Vi,并且经过街道i需花费Ti分钟.街道信息不会重复给出.Output 仅包含整数T,即最坏情况下Chris的父母需要花费T分钟才能找到Chris.Sample Input 4 3 1 2 1 2 3 1 3 4

BZOJ 1509: [NOI2003]逃学的小孩( 树形dp )

树形dp求出某个点的最长3条链a,b,c(a>=b>=c), 然后以这个点为交点的最优解一定是a+2b+c.好像还有一种做法是求出树的直径然后乱搞... --------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<cctype> using

BZOJ 1509 [NOI2003]逃学的小孩

题意:给定一棵树,设A, B, C为树上的三个不相同的点,求出max{dist(A, B) + min{dist(C, A), dist(C, B)}} 首先,如果dist(A,B)最大的话,很显然这是树上的一条最长链.也就是说,A和B是树上任意一条最长链的两个端点. 然后,我们有一个结论:树上某个点的最远点必定是树上任意一条最长链的两个端点中的一个.. 综合上面两个结论我们可以得到,当dist(A, B)和min{dist(C, A), dist(C, B)}同时取最大时,都与树上的最长链有关

BZOJ1509 NOI2003 逃学的小孩

Description: Input: 第一行是两个整数N(3 ? N ? 200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1?Ui, Vi ? N,1 ? Ti ? 1000000000),表示街道i连接居住点Ui和Vi,并且经过街道i需花费Ti分钟.街道信息不会重复给出. Output: 仅包含整数T,即最坏情况下Chris的父母需要花费T分钟才能找到Chris. 思路:由于规则2,可知题目给出的是一棵树 然后求一根直径

【BZOJ1509】逃学的小孩

1509: [NOI2003]逃学的小孩 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 822  Solved: 409[Submit][Status][Discuss] Description Input 第一行是两个整数N(3 ? N ? 200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1?Ui, Vi ? N,1 ? Ti ? 1000000000),表示街道i连接居住点U

【树的直径应用】 逃学的小孩

题目 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚,他们决定在尽量短的时间内找到Chris.他们告诉Chris的老师:“根据以往的经验,Chris现在必然躲在朋友Shermie或Yashiro家里偷玩<拳皇>游戏.现在,我们就从家出发去找Chris,一但找到,我们立刻给您打电话.”说完砰的一声把电话挂了. Chris居住的城市由N个居住点和若干条连接居住点的双向街

树形动态规划专题

1.OJ1278战略游戏 f[u][0]代表以u为根的子树,u不放时,最少放置节点数. f[u][1]代表以u为根的子树,u放时,最少放置节点数. f[u][0]=Σf[son][1]. f[u][1]=Σmin(f[son][1],f[son][0]). ans=min(f[root][0],f[root][1]). #include<cstdio> #include<iostream> using namespace std; const int maxn=1500; int

(树直径) bzoj 1509

1509: [NOI2003]逃学的小孩 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 447  Solved: 240[Submit][Status][Discuss] Description Input 第一行是两个整数N(3 ? N ? 200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1?Ui, Vi ? N,1 ? Ti ? 1000000000),表示街道i连接居住点U

非洲小孩(南阳oj1036)(贪心)

非洲小孩 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 家住非洲的小孩,都很黑.为什么呢? 第一,他们地处热带,太阳辐射严重. 第二,他们不经常洗澡.(常年缺水,怎么洗澡.) 现在,在一个非洲部落里,他们只有一个地方洗澡,并且,洗澡时间很短,瞬间有木有!!(这也是没有的办法,缺水啊!!) 每个小孩有一个时间段能够洗澡.并且,他们是可以一起洗的(不管你是男孩是女孩). 那么,什么时间洗澡,谁应该来洗,由谁决定的呢?那必然是他们伟大的"澡"神啊."