神秘错误求调
  • 板块学术版
  • 楼主Otomachi_Una_
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/15 09:35
  • 上次更新2023/11/15 13:51:11
查看原帖
神秘错误求调
248400
Otomachi_Una_楼主2023/11/15 09:35

这是我的代码:

#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=250000n=250000 的链的时候,就会出现 MLE。我通过测试发现大概是 2929 行的那个 else 后面有问题,但是数据当中 2929 行后面的 else 根本不会运行。。

有没有人教一下哪里错了,洛谷上也是注释 2929 行就能跑过去,把 2828 行 assert(0) 打开也能跑过去,但是 2929 行后面就跑不过去了。

2023/11/15 09:35
加载中...