发现只有斐波那契这种形式的数才不能构成三角形 INT范围内只有50多项 所以暴力跑 小于50暴力判断 大于50直接输出YES
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m,cnt;
int q[N],last[N],v[N],deep[N],fa[N];
struct data{int to,next;}e[N*2];
void insert(int u,int v)
{
e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;
}
void dfs(int x)
{
for(int i=last[x];i;i=e[i].next)
if(e[i].to!=fa[x])
{
fa[e[i].to]=x;
deep[e[i].to]=deep[x]+1;
dfs(e[i].to);
}
}
void query(int a,int b)
{
int top=0;
while(top<50&&a!=b)
{
if(deep[a]>deep[b])q[++top]=v[a],a=fa[a];
else q[++top]=v[b],b=fa[b];
}
q[++top]=v[a];
if(top>=50){puts("Y");return;}
sort(q+1,q+top+1);
for(int i=1;i<=top-2;i++)
if((ll)q[i]+q[i+1]>q[i+2]){puts("Y");return;}
puts("N");
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)v[i]=read();
for(int i=1;i<n;i++)
{
int u=read(),v=read();
insert(u,v);insert(v,u);
}
dfs(1);
for(int i=1;i<=m;i++)
{
int t=read(),a=read(),b=read();
if(!t)query(a,b);
else v[a]=b;
}
}
470

被折叠的 条评论
为什么被折叠?



