玄关,灵异事件求助:RE&TLE&AC?
  • 板块题目总版
  • 楼主Joe2011
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/9/2 22:14
  • 上次更新2024/9/3 16:38:30
查看原帖
玄关,灵异事件求助:RE&TLE&AC?
552404
Joe2011楼主2024/9/2 22:14

这一份代码获得了三个不同的评测结果。。。

#include<bits/stdc++.h>
using namespace std;
const int N=50010;
int n,m,a[N],fa[N],fup[N],fdo[N],mn[N],mx[N],ans[N],vis[N];
struct node{int s,t,x;};
vector<node> qry[N],q[N];
vector<int> G[N];
int find(int x){
    if (fa[x]==x)
        return x;
    int t=fa[x];
    fa[x]=find(fa[x]);
    fup[x]=max(mx[t]-mn[x],max(fup[x],fup[t]));
    fdo[x]=max(mx[x]-mn[t],max(fdo[x],fdo[t]));
    mn[x]=min(mn[x],mn[t]);
    mx[x]=max(mx[x],mx[t]);
}
void dfs(int u,int pr){
    vis[u]=1;
    mn[u]=mx[u]=a[u];
    fdo[u]=fup[u]=0;
    for (node e:qry[u]){
        int v=(e.s==u?e.t:e.s);
        if (vis[v])
            q[find(v)].push_back(e);
    }
    for (int v:G[u]) if (v!=pr)
        dfs(v,u);
    for (node res:q[u]){
        find(res.s);
        find(res.t);
        ans[res.x]=max({mx[res.t]-mn[res.s],fup[res.s],fdo[res.t]});
    }
    fa[u]=pr;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for (int i=1;i<=n;i++)
        fa[i]=i;
    for (int i=1;i<=n;i++)
        cin>>a[i];
    for (int i=1;i<n;i++){
        int x,y;
        cin>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    cin>>m;
    for (int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        qry[x].push_back({x,y,i});
        qry[y].push_back({x,y,i});
    }
    dfs(1,0);
    for (int i=1;i<=m;i++)
        cout<<ans[i]<<'\n';
    return 0;
}

这是洛谷IDE: 这是学校OJ 这是我的本地

为了避免评测机不稳定导致的异常因素,我进行了多次测试,得到了相同的结果。。。

求调/求解

2024/9/2 22:14
加载中...