关于Undefined Behaviour
查看原帖
关于Undefined Behaviour
108244
Neal_lee楼主2021/1/3 08:10

本人这道题AC了,但是发现只要开O2就会很奇怪地MLE,怀疑是UB但是没查出来,有人可以帮忙看看吗,应该不用太在意代码细节吧QAQ。

提交记录:

AC https://www.luogu.com.cn/record/44556400

MLE https://www.luogu.com.cn/record/44556399

Code:

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 100100
using namespace std;
inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
    return s*w;
}
int head[N],to[N*2],nxt[N*2];
int cnt,len[N*2],d[N],maxx[N];
void init(){
    cnt=-1;
    memset(head,-1,sizeof(head));
}
void add_e(int a,int b,bool id){
    nxt[++cnt]=head[a];
    head[a]=cnt;
    to[cnt]=b;
    len[cnt]=1;
    if(id)add_e(b,a,0);
}
int ans,l,r,node;
bool Max(int &a,int b){
    if(a>=b)return false;
    a=b; return true;
}
int dfs(int x,int fa){
    for(int i=head[x];~i;i=nxt[i]){
        if(to[i]==fa)continue;
        int y=to[i];
        dfs(y,x);
        if(Max(ans,d[x]+d[y]+len[i]))node=x,l=maxx[x],r=y;
        if(Max(d[x],d[y]+len[i]))maxx[x]=y;
    }
}
void reverse(int x){
    for(int i=head[x];~i;i=nxt[i])
        if(to[i]==maxx[x]){
            len[i]=-1;
            reverse(to[i]);
            break;
        }
}
int main(){
    int n,k;
    int a,b;
    cin>>n>>k;
    init();
    for(int i=1;i<n;i++){
        a=read(),b=read();
        add_e(a,b,1);
    }
    dfs(1,0);
    if(k==1){
        cout<<2*(n-1)-ans+1;
        return 0;
    }
    int L1=ans,L2;
    for(int i=head[node];~i;i=nxt[i])
        if(to[i]==l||to[i]==r){
            len[i]=-1;
            reverse(to[i]);
        }
    ans=0;
    memset(d,0,sizeof(d));
    dfs(1,0);
    L2=ans;
    cout<<2*n-L1-L2;
    return 0;
}
2021/1/3 08:10
加载中...