本人这道题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;
}