为何不用建图
查看原帖
为何不用建图
399250
AffineRing楼主2020/11/5 21:25

rt,我用的链式前向星建图了,然后还AC了。

发现其实只需要找到idid最小的中最大的一个,以及这个节点旁边idid最小、值最大的一个即可。

#include<bits/stdc++.h>
using namespace std;

inline long long read()
{
	long long a=0;
	long long f=0;
	char p=getchar();
	while(!isdigit(p))
	{
		f|=p=='-';
		p=getchar();
	}
	while(isdigit(p))
	{
		a=(a<<3)+(a<<1)+(p^48);
		p=getchar();
	}
	return f?-a:a;
}

struct Edge
{
	long long nxt;
	long long to;
};
Edge e[2000005];
long long t,n,m,a[2000005];
long long aw1,as1,aw2,as2;
long long head[2000005],tot;

void add(long long u,long long v)
{
	e[++tot].to=v;
	e[tot].nxt=head[u];
	head[u]=tot;
}

int main(){
	cin>>t;
	while(t--)
	{
		memset(a,0,sizeof(a));
		memset(e,0,sizeof(e));
		memset(head,0,sizeof(head));
		tot=0;
		n=read(),m=read();
		for(long long i=1;i<=n;i++)
		{
			a[i]=read();
		}
		for(long long i=1;i<n;i++)
		{
			long long x,y;
			x=read(),y=read();
			add(x,y);add(y,x);
		}
		if(n==1)
		{
			cout<<1<<endl;continue;
		}
		as1=as2=aw1=aw2=-1;
		for(long long i=1;i<=n;i++)
			if(aw1<a[i])
				aw1=a[i],as1=i;
		for(long long i=head[as1];i;i=e[i].nxt)
		{
			long long df=a[e[i].to];
			if(e[i].to==as1)
				continue;
			if(aw2<df)aw2=df,as2=e[i].to;
		}
		if(as2<as1)
		{
			if(m-aw1+aw2<0)
				cout<<as1<<endl;
			else if((m-aw1+aw2)%2==0)
				cout<<as2<<endl;
			else 
				cout<<as1<<endl;
			continue;
		}
		if(as2>as1)
		{
			if(m-aw1+aw2-1<0)
				cout<<as1<<endl;
			else if((m-aw1+aw2-1)%2==0)
				cout<<as2<<endl;
			else 
				cout<<as1<<endl;
			continue;
		}
	}
	return 0;
}

下面是考试时的代码:

#include<bits/stdc++.h>
using namespace std;
inline long long read(){
	long long a=0,f=0;char p=getchar();
	while(!isdigit(p)){f|=p=='-';p=getchar();}
	while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=getchar();}
	return f?-a:a;
}
struct Edge{long long nxt,to;}e[2000005];
long long t,n,m,a[2000005],aw1,as1,aw2,as2,head[2000005],tot;
void add(long long u,long long v){
	e[++tot].to=v;
	e[tot].nxt=head[u];
	head[u]=tot;
}
int main(){
	cin>>t;
	while(t--){
		memset(a,0,sizeof(a));
		memset(e,0,sizeof(e));
		memset(head,0,sizeof(head));
		tot=0;
		n=read(),m=read();
		for(long long i=1;i<=n;i++)a[i]=read();
		for(long long i=1;i<n;i++){
			long long x,y;x=read(),y=read();
			add(x,y);add(y,x);
		}
		if(n==1)cout<<1<<endl;continue;
		as1=as2=aw1=aw2=-1;
		for(long long i=1;i<=n;i++)
			if(aw1<a[i])aw1=a[i],as1=i;
		for(long long i=head[as1];i;i=e[i].nxt){
			long long df=a[e[i].to];
			if(e[i].to==as1)continue;
			if(aw2<df)aw2=df,as2=e[i].to;
		}
		if(as2<as1){
			if(m-aw1+aw2<0)cout<<as1<<endl;
			else if((m-aw1+aw2)%2==0)cout<<as2<<endl;
			else cout<<as1<<endl;
			continue;
		}
		if(as2>as1){
			if(m-aw1+aw2-1<0)cout<<as1<<endl;
			else if((m-aw1+aw2-1)%2==0)cout<<as2<<endl;
			else cout<<as1<<endl;
			continue;
		}
	}
	return 0;
}

重度压行代码:

#include<bits/stdc++.h>
using namespace std;
inline long long read(){
	long long a=0,f=0;char p=getchar();
	while(!isdigit(p)){f|=p=='-';p=getchar();}
	while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=getchar();}
	return f?-a:a;
}
struct Edge{long long nxt,to;}e[2000005];
long long t,n,m,a[2000005],aw1,as1,aw2,as2,head[2000005],tot;
void add(long long u,long long v){e[++tot].to=v;e[tot].nxt=head[u];head[u]=tot;}
int main(){
	cin>>t;
	while(t--){
		memset(a,0,sizeof(a));memset(e,0,sizeof(e));memset(head,0,sizeof(head));
		tot=0;
		n=read(),m=read();
		for(long long i=1;i<=n;i++)a[i]=read();
		for(long long i=1;i<n;i++){long long x,y;x=read(),y=read();add(x,y);add(y,x);}
		if(n==1)cout<<1<<endl;continue;
		as1=as2=aw1=aw2=-1;
		for(long long i=1;i<=n;i++)
			if(aw1<a[i])aw1=a[i],as1=i;
		for(long long i=head[as1];i;i=e[i].nxt){
			long long df=a[e[i].to];
			if(e[i].to==as1)continue;if(aw2<df)aw2=df,as2=e[i].to;
		}
		if(as2<as1){
			if(m-aw1+aw2<0)cout<<as1<<endl;else if((m-aw1+aw2)%2==0)cout<<as2<<endl;
			else cout<<as1<<endl;continue;
		}
		if(as2>as1){
			if(m-aw1+aw2-1<0)cout<<as1<<endl;else if((m-aw1+aw2-1)%2==0)cout<<as2<<endl;
			else cout<<as1<<endl;continue;
		}
	}
	return 0;
}
2020/11/5 21:25
加载中...