TLE 0pts 求助!
查看原帖
TLE 0pts 求助!
681036
OldDriverTree楼主2023/1/27 22:09

只有 #5 过了,其他的点都超时了,样例也能过

是不是常数有点大?

#include<bits/stdc++.h>
#define f first
#define g second
using namespace std;
typedef pair<int,int> PII;
const int N=3e5,M=4e5;

PII a[N],val[M],dis[M];
int depth[N],fa[N][18];
int n,q,tot,head[N],to[M],nxt[M];

void add(int x,int y,PII z) {
	to[tot]=y,val[tot]=z;
	nxt[tot]=head[x];
	head[x]=tot++;
}
void dfs(int u,int father)
{
	fa[u][0]=father;
	depth[u]=depth[father]+1;
	for (int i=1;i<18;i++)
		fa[u][i]=fa[fa[u][i-1]][i-1];
	
	for (int i=head[u];~i;i=nxt[i])
	{
		int v=to[i]; PII x=val[i];
		if (v!=father) {
			dis[v].f=dis[u].f+x.f;
			dis[v].g=dis[u].g+x.g;
			dfs(v,u);
		}
	}
}
int LCA(int x,int y)
{
	if (depth[x]<depth[y]) swap(x,y);
	for (int i=17;i>=0;i--)
		if (depth[fa[x][i]]>=depth[y])
			x=fa[x][i];
	if (x==y) return x;
	for (int i=17;i>=0;i--)
		if (fa[x][i]!=fa[y][i])
			x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
int main()
{
	scanf("%d%d",&n,&q);
	memset(head,-1,sizeof head);
	for (int i=1,x;i<=n;i++) {
		scanf("%d",&x);
		while (!(x&1)) x>>=1,a[i].f++;
		while (!(x%5)) x/=5,a[i].g++;
	}
	for (int i=1;i<n;i++) {
		int x,y,z; double t; PII v;
		scanf("%d%d%lf",&x,&y,&t);
		z=t*1e4,v.f=v.g=-4;
		while (!(z&1)) z>>=1,v.f++;
		while (!(z%5)) z/=5,v.g++;
		add(x,y,v),add(y,x,v);
	}
	dfs(1,0);
	while (q--) {
		int x,y,z; PII v;
		scanf("%d%d",&x,&y);
		z=LCA(x,y);
		v.f=dis[x].f+dis[y].f-(dis[z].f<<1)+a[x].f;
		v.g=dis[x].g+dis[y].g-(dis[z].g<<1)+a[x].g;
		puts(v.f>=0&&v.g>=0?"Yes":"No");
	}
	return 0;
}
2023/1/27 22:09
加载中...