关于 emplace(_back)
  • 板块学术版
  • 楼主蒟酱厂妹
  • 当前回复11
  • 已保存回复11
  • 发布时间2022/4/23 19:51
  • 上次更新2023/10/28 03:01:53
查看原帖
关于 emplace(_back)
310818
蒟酱厂妹楼主2022/4/23 19:51
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
//快读板子省略
constexpr int kN=1e5+7;
struct edge{int v,t;};
std::vector<edge>s[kN];
int dep[kN],fa[kN];
bool edi[kN];
void dfs(int u,int &m){
	for(auto[v,t]:s[u]){
		if(v==fa[u])continue;
		if((dep[v]=dep[u]+t)>dep[m])m=v;
		fa[v]=u;dfs(v,m);
	}
}
void dp(int u,int &m){
	for(auto[v,t]:s[u]){
		if(v==fa[u])continue;
		dp(v,m);
		m=std::max(m,t+dep[u]+dep[v]);
		dep[u]=std::max(dep[u],dep[v]+t);
	}
}
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	int n,k,m1,m2;fio>>n>>k;
	for(int i=1,u,v;i<n;i++)fio>>u>>v,s[u].emplace_back(v,1),s[v].emplace_back(u,1);
	dfs(1,m1);dep[m1]=fa[m1]=0;dfs(m1,m2);
	int ans=((n-1)<<1)-(dep[m2]-1);
	if(k==2){
		while(m2)edi[m2]=true,m2=fa[m2];
		for(int u=1;u<=n;u++)if(edi[u])for(auto&[v,t]:s[u])if(edi[v])t=-1;
		m2=0;std::fill_n(dep+1,n,0);
		dp(m1,m2);ans-=m2-1;
	}
	fio<<ans;
	return 0;
}

这份代码在洛谷上能跑,但是在 AcWing 里跑不了,检查后发现是 emplacae_back 的问题,而且 SPOJ 上也不能这么用 emplace_back,Codeforces 可以使用,如果要使用必须 :

for(int i=1,u,v;i<n;i++)fio>>u>>v,s[u].emplace_back(edge{v,1}),s[v].emplace_back(edge{u,1});

这个报错是编译器不一样产生的问题吗?日常生活可以用吗?CSP NOIP可以用吗?

2022/4/23 19:51
加载中...