为什么开了O2更慢?
  • 板块灌水区
  • 楼主WannaYellow
  • 当前回复12
  • 已保存回复12
  • 发布时间2022/7/1 20:53
  • 上次更新2023/10/27 22:07:55
查看原帖
为什么开了O2更慢?
542905
WannaYellow楼主2022/7/1 20:53

rt.

是不开O2

是开O2

code:

#include<iostream>
using namespace std;
struct EDGE{
	int to,next,val;
}e[500005<<1];
const int MIN=0x80000000;
int cntedge,head[500005];
void addedge(int u,int v,int w){
	e[++cntedge].to=v;
	e[cntedge].val=w;
	e[cntedge].next=head[u];
	head[u]=cntedge;
}
void daddedge(int u,int v,int w){
	addedge(u,v,w);
	addedge(v,u,w);
}
inline int read(){
	int t=1,re=0;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')re=(re<<3)+(re<<1)+(ch^'0'),ch=getchar();
	return re*t; 
}
int down[500005][2],up[500005],dp[500005];
bool vis[500005];
int n;
void change(int &maxx,int &maxy,int ch){
	if(ch>maxx)maxy=maxx,maxx=ch;
	else if(ch<=maxx&&ch>maxy)maxy=ch;
}
int dfsdown(int now,int fa){
	if(vis[now])return down[now][0];
	vis[now]=true;
	for(int i=head[now];i;i=e[i].next){
		if(e[i].to==fa)continue;
		int next=dfsdown(e[i].to,now);
		if(next==MIN)next=e[i].val;
		else next+=e[i].val;
		change(down[now][0],down[now][1],next);
	}
	return down[now][0];
}
int dfsup(int now,int fa){
	for(int i=head[now];i;i=e[i].next){
		if(e[i].to==fa)continue;
		int dwn=down[now][0];
		if(dwn==down[e[i].to][0]+e[i].val){
			dwn=down[now][1];
			if(dwn==MIN)dwn=0;
		}		
		up[e[i].to]=e[i].val+max(dwn,up[now]);
		dfsup(e[i].to,now);
	}
}
int ans;
int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int u=read(),v=read(),w=read();
		daddedge(u,v,w);
	}
	for(int i=1;i<=n;i++)down[i][0]=down[i][1]=MIN;
	dfsdown(1,0);
	dfsup(1,0);
	for(int i=1;i<=n;i++){
		if(down[i][0]==MIN)dp[i]=up[i];
		else dp[i]=down[i][0]+max(down[i][1],up[i]);
		ans=max(ans,dp[i]);
	}
	cout<<ans;
	return 0;
}
2022/7/1 20:53
加载中...