求助!为什么会TLE?
查看原帖
求助!为什么会TLE?
297647
Z_F_C楼主2022/9/20 22:37

RT,人麻了

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5;
int n,m;
ll val[N*2+5];
struct EDGE{
	int u,v;
	ll w;
}edge[N+5];

int cnt=0;
void add(int u,int v,int w)
{
	edge[++cnt].u=u;
	edge[cnt].v=v;
	edge[cnt].w=w;
}

int f[N*2+5],fa[N*2+5][20];
int find(int x)
{
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}

int jd,W[N*2+5];
bool cmp(EDGE x,EDGE y) {return x.w<y.w;}
void kruskal()//重构树 
{
	jd=n;
	sort(edge+1,edge+1+m,cmp);
	for(int i=1;i<=m;i++)
	{
		int x=find(edge[i].u),y=find(edge[i].v);
		if(x!=y)
		{
			jd++;
			f[x]=f[y]=jd;
			fa[x][0]=fa[y][0]=jd;
			val[jd]=val[x]+val[y];
			W[jd]=edge[i].w;
		}
	}
	int k=log(jd)/log(2);
	for(int i=1;i<=jd;i++)
		for(int j=1;j<=k;j++)
			fa[i][j]=fa[fa[i][j-1]][j-1];
	for(int i=1;i<=n;i++)
	{
		int x=i;
		while(1)
		{
			ll sum=val[x];
			for(int j=k;j>=0;j--)
			{
				if(!fa[x][j]||sum<W[fa[x][j]]) continue;
				x=fa[x][j];
				break;
			}
			if(sum==val[x]) break;//跳不动了
		}
		printf("%d",fa[x][0]==0?1:0);
	}
}

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<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		val[i]=1ll*read();
		f[i]=i;
		f[i+n]=i+n;
	}
	for(int i=1;i<=m;i++)
	{
		int x=read(),y=read();
		add(x,y,max(val[x],val[y]));
	}
	kruskal();
	return 0;
}

大佬求调QAQ

2022/9/20 22:37
加载中...