rt,我用的链式前向星建图了,然后还AC了。
发现其实只需要找到id最小的中最大的一个,以及这个节点旁边id最小、值最大的一个即可。
#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;
}