这个稍微难一点。

你先把三棵树建出来,然后随一坨序列进行乱搞。

具体地,你先随一个序列,然后用平面最远点对的方法去迭代直到不能再优化答案。

然后这道题卡时一定要松一点(取3.9s),因为你迭代一次要花好长好长的时间的,所以如果你卡的比较紧(例如3.975s左右)在洛谷上会T。

代码写的可答辩了,没办法,毕竟这题太难了,正解的前置知识都不会。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=200005;
int n,rt,a[N],v[N];
ll d[N],ans;
mt19937 rd((unsigned long long)new char);
struct node{
int b[2*N],cnt;ll dep[N];
vector<int> g[N];
vector<ll> w[N];
void add(int x,int y,ll z){
b[cnt+1]=x;b[cnt+2]=y;
g[x].push_back(y);g[y].push_back(x);
w[x].push_back(z);w[y].push_back(z);cnt+=2;
}
void init(int st){
memset(dep,0,sizeof dep);
queue<int> q;q.push(st);
while(!q.empty()){
int x=q.front();q.pop();
d[x]+=dep[x];
for(int i=0;i<g[x].size();++i){
int &y=g[x][i];
if(!dep[y])dep[y]=dep[x]+w[x][i],q.push(y);
}
}
}
}tr[3];
unordered_map<int,int> mp;
int main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(int i=1;i<=n;++i)a[i]=i;
for(int i=1;i<n;++i){
ll u,v,w;cin>>u>>v>>w;
tr[0].add(u,v,w);
}
for(int i=1;i<n;++i){
ll u,v,w;cin>>u>>v>>w;
tr[1].add(u,v,w);
}
for(int i=1;i<n;++i){
ll u,v,w;cin>>u>>v>>w;
tr[2].add(u,v,w);
}
while(1.0*clock()/CLOCKS_PER_SEC<=3.9){
rt=rd()%n+1;
while(v[a[rt]])++rt;
if(rt>n)continue;
mp.clear();
while(!mp[a[rt]]&&!v[a[rt]]){
mp[a[rt]]=1;
memset(d,0,sizeof d);
for(int i=0;i<3;++i)tr[i].init(a[rt]);
ll s=0;int id=0;
for(int i=1;i<=n;++i)
if(s<d[a[i]])s=d[a[i]],id=i;
v[a[rt]]=s;
ans=max(ans,s);rt=id;
}
shuffle(a+1,a+n+1,rd);
}
cout<<ans<<'\n';
return 0;
}

upd on 9.15: 被LOJ的Hack数据打包了,现在来更新一下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=200005;
int n,rt,a[N],v[N];
ll d[N],d2[N],ans;
mt19937 rd((unsigned long long)new char);
ll dat[3];
struct node{
int b[2*N],cnt,vis[N];ll dep[N];
vector<int> g[N];
vector<ll> w[N];
void add(int x,int y,ll z){
b[cnt+1]=x;b[cnt+2]=y;
g[x].push_back(y);g[y].push_back(x);
w[x].push_back(z);w[y].push_back(z);cnt+=2;
}
void init(int st,int da){
memset(dep,0,sizeof dep);
memset(vis,0,sizeof vis);
queue<int> q;q.push(st);
while(!q.empty()){
int x=q.front();q.pop();vis[x]=1;
d[x]+=dep[x]*da;d2[x]+=dep[x];
for(int i=0;i<g[x].size();++i){
int &y=g[x][i];
if(!dep[y]&&!vis[y])dep[y]=dep[x]+w[x][i],q.push(y);
}
}
}
}tr[3];
unordered_map<int,int> mp;
int main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(int i=1;i<=n;++i)i=i;
for(int i=1;i<n;++i){
ll u,v,w;cin>>u>>v>>w;
tr[0].add(u,v,w);
}
for(int i=1;i<n;++i){
ll u,v,w;cin>>u>>v>>w;
tr[1].add(u,v,w);
}
for(int i=1;i<n;++i){
ll u,v,w;cin>>u>>v>>w;
tr[2].add(u,v,w);
}
dat[0]=0;dat[1]=0;dat[2]=1;
int tot=0;
while(1.0*clock()/CLOCKS_PER_SEC<=0.25){
rt=rd()%n+1;
int cn=0;
while(++cn<=12){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
}
}
dat[0]=0;dat[1]=1;dat[2]=0;
while(1.0*clock()/CLOCKS_PER_SEC<=0.5){
rt=rd()%n+1;
int cn=0;
while(++cn<=12){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
}
}
dat[0]=1;dat[1]=0;dat[2]=0;
while(1.0*clock()/CLOCKS_PER_SEC<=0.8){
rt=rd()%n+1;
int cn=0;
while(++cn<=12){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
}
}
dat[0]=1;dat[1]=0;dat[2]=1;
while(1.0*clock()/CLOCKS_PER_SEC<=1.1){
rt=rd()%n+1;
int cn=0;
while(++cn<=12){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
}
}
dat[0]=0;dat[1]=1;dat[2]=1;
while(1.0*clock()/CLOCKS_PER_SEC<=1.4){
rt=rd()%n+1;
int cn=0;
while(++cn<=12){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
}
}
dat[0]=1;dat[1]=1;dat[2]=0;
while(1.0*clock()/CLOCKS_PER_SEC<=1.6){
rt=rd()%n+1;
int cn=0;
while(++cn<=12){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
}
}
dat[0]=1;dat[1]=1;dat[2]=1;
memset(v,0,sizeof v);mp.clear();
for(int i=1;i<=15&&1.0*clock()/CLOCKS_PER_SEC<=3.6;++i){
rt=rd()%n+1;
while(v[rt])++rt;
if(rt>n)continue;
int cn=0;
while(!mp[rt]&&!v[rt]&&++cn<=10){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
if(1.0*clock()/CLOCKS_PER_SEC>=3.9)break;
}
}
cout<<ans<<'\n';
return 0;
}

Hack0:给每棵树带01权值多跑几遍就能救回来了。

Hack1&Hack2:bfs写挂了

纯傻逼。刷弱智题还卡那么久。

upd: 被uoj的hack数据打包了,现在又又又又过了,来加强一下代码。(调参调的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=200005;
int n,rt,a[N],v[N];
ll d[N],d2[N],ans;
mt19937 rd((unsigned long long)new char);
ll dat[3];
struct node{
int b[2*N],cnt,vis[N];ll dep[N];
vector<int> g[N];
vector<ll> w[N];
void add(int x,int y,ll z){
b[cnt+1]=x;b[cnt+2]=y;
g[x].push_back(y);g[y].push_back(x);
w[x].push_back(z);w[y].push_back(z);cnt+=2;
}
void init(int st,int da){
memset(dep,0,sizeof dep);
memset(vis,0,sizeof vis);
queue<int> q;q.push(st);
while(!q.empty()){
int x=q.front();q.pop();vis[x]=1;
d[x]+=dep[x]*da;d2[x]+=dep[x];
for(int i=0;i<g[x].size();++i){
int &y=g[x][i];
if(!dep[y]&&!vis[y])dep[y]=dep[x]+w[x][i],q.push(y);
}
}
}
}tr[3];
unordered_map<int,int> mp;
int main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(int i=1;i<=n;++i)i=i;
for(int i=1;i<n;++i){
ll u,v,w;cin>>u>>v>>w;
tr[0].add(u,v,w);
}
for(int i=1;i<n;++i){
ll u,v,w;cin>>u>>v>>w;
tr[1].add(u,v,w);
}
for(int i=1;i<n;++i){
ll u,v,w;cin>>u>>v>>w;
tr[2].add(u,v,w);
}
dat[0]=0;dat[1]=0;dat[2]=1;
int tot=0;
while(1.0*clock()/CLOCKS_PER_SEC<=0.3){
rt=rd()%n+1;
int cn=0;
while(++cn<=20){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
}
}
dat[0]=0;dat[1]=1;dat[2]=0;
while(1.0*clock()/CLOCKS_PER_SEC<=0.6){
rt=rd()%n+1;
int cn=0;
while(++cn<=20){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
}
}
dat[0]=1;dat[1]=0;dat[2]=0;
while(1.0*clock()/CLOCKS_PER_SEC<=0.9){
rt=rd()%n+1;
int cn=0;
while(++cn<=20){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
}
}
dat[0]=1;dat[1]=0;dat[2]=1;
while(1.0*clock()/CLOCKS_PER_SEC<=1.2){
rt=rd()%n+1;
int cn=0;
while(++cn<=20){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
}
}
dat[0]=0;dat[1]=1;dat[2]=1;
while(1.0*clock()/CLOCKS_PER_SEC<=1.5){
rt=rd()%n+1;
int cn=0;
while(++cn<=20){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
}
}
dat[0]=1;dat[1]=1;dat[2]=0;
while(1.0*clock()/CLOCKS_PER_SEC<=1.8){
rt=rd()%n+1;
int cn=0;
while(++cn<=20){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
}
}
dat[0]=1;dat[1]=1;dat[2]=1;
memset(v,0,sizeof v);mp.clear();
for(int i=1;i<=12&&1.0*clock()/CLOCKS_PER_SEC<=3.6;++i){
rt=rd()%n+1;
while(v[rt])++rt;
if(rt>n)continue;
int cn=0;
while(!mp[rt]&&!v[rt]&&++cn<=10){
mp[rt]=1;
memset(d,0,sizeof d);
memset(d2,0,sizeof d2);
for(int i=0;i<3;++i)tr[i].init(rt,dat[i]);
ll s=0;int id=0;
for(int i=1;i<=n;++i){
if(!mp[i]&&s<d[i])s=d[i],id=i;
ans=max(ans,d2[i]);
}
rt=id;
if(1.0*clock()/CLOCKS_PER_SEC>=3.9)break;
}
}
cout<<ans<<'\n';
return 0;
}