社区讨论
MLE on task #20 求助
P2680[NOIP 2015 提高组] 运输计划参与者 2已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @mhj41jel
- 此快照首次捕获于
- 2025/11/03 20:22 4 个月前
- 此快照最后确认于
- 2025/11/03 20:22 4 个月前
Code:
CPP#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
struct Query{
int u,v,len,lca;
}ask[N];
struct Edge{
int to,nxt,w;
}e[N];
int n,m,idx,ml;
int hd[N],dep[N],dis[N],st[N][25],val_to[N],d[N];
void add(int u,int v,int w){
idx++;
e[idx].to=v;
e[idx].w=w;
e[idx].nxt=hd[u];
hd[u]=idx;
}
void dfs1(int u,int p){
dep[u]=dep[p]+1;
st[u][0]=p;
for (int i=1;i<=20;i++){
st[u][i]=st[st[u][i-1]][i-1];
}
for (int i=hd[u];i;i=e[i].nxt){
int v=e[i].to;
if (v!=p){
dis[v]=dis[u]+e[i].w;
val_to[v]=e[i].w;
dfs1(v,u);
}
}
}
int _lca(int x,int y){
if (dep[x]<dep[y])swap(x,y);
for (int i=20;i>=0;i--){
if (dep[st[x][i]]>=dep[y])x=st[x][i];
}
if (x==y)return x;
for (int i=20;i>=0;i--){
if (st[x][i]!=st[y][i]){
x=st[x][i];
y=st[y][i];
}
}
return st[x][0];
}
void dfs2(int u,int p){
for (int i=hd[u];i;i=e[i].nxt){
int v=e[i].to;
if (v!=p){
dfs2(v,u);
d[u]+=d[v];
}
}
}
bool chk(int lim){
memset(d,0,sizeof(d));
int cnt=0,dw=0;
for (int i=1;i<=m;i++){
if (ask[i].len>lim){
cnt++;
d[ask[i].u]++,d[ask[i].v]++,d[ask[i].lca]-=2;
}
}
dfs2(1,0);
for (int i=2;i<=n;i++){
if (d[i]==cnt){
dw=max(dw,val_to[i]);
}
}
return ml-dw<=lim;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>m;
for (int i=1;i<=n-1;i++){
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
dfs1(1,0);
for (int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
int lca=_lca(u,v);
ml=max(ml,dis[u]+dis[v]-2*dis[lca]);
ask[i]={u,v,dis[u]+dis[v]-2*dis[lca],lca};
}
int l=1,r=ml,ans=ml;
while (l<=r){
int mid=(l+r)>>1;
if (chk(mid)){
r=mid-1;
ans=mid;
}else l=mid+1;
}
cout<<ans;
return 0;
}
请问还有哪些数组是能优化的吗?
回复
共 7 条回复,欢迎继续交流。
正在加载回复...