这是我的代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MP make_pair
mt19937 rnd(time(0));
const int MAXN=2.5e5+5;
int n;
bool Mbe;
vector<int> edg[MAXN];
bitset<MAXN> bs;
int siz[MAXN];ll f[MAXN],ans=0;
void dfs1(int u,int fa){
siz[u]=1;
for(int v:edg[u]) if(v!=fa){
dfs1(v,u);
siz[u]+=siz[v];f[u]+=f[v]+siz[v];
}
}
void dfs(int u,int fa){
int maxx=0;siz[u]=1;
f[u]=0;
for(int v:edg[u]) f[u]+=f[v]+siz[v];
for(int v:edg[u]){
maxx=max(maxx,siz[v]);
siz[u]+=siz[v];
}
if(maxx>=n/2) ans=max(ans,f[u]+1ll*maxx*(n-1-maxx));
// else assert(0);
else{
bs.reset();
bs[0]=true;
for(int v:edg[u]){
bs|=(bs<<siz[v]);
}
for(int i=0;i<n;i++) if(bs[i]) ans=max(ans,f[u]+1ll*i*(n-1-i));
}
for(int v:edg[u]) if(v!=fa){
ll _f=f[u],_s=siz[u];
f[u]-=f[v]+siz[v];siz[u]-=siz[v];
dfs(v,u);
f[u]=_f,siz[u]=_s;
}
}
int main(){
ios::sync_with_stdio(false);
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
cin>>n;
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
edg[u].push_back(v);
edg[v].push_back(u);
}
dfs1(1,0);dfs(1,0);
cout<<n-1<<' '<<ans<<endl;
}
当输入为 n=250000 的链的时候,就会出现 MLE。我通过测试发现大概是 29 行的那个 else 后面有问题,但是数据当中 29 行后面的 else 根本不会运行。。
有没有人教一下哪里错了,洛谷上也是注释 29 行就能跑过去,把 28 行 assert(0) 打开也能跑过去,但是 29 行后面就跑不过去了。