求助:整体二分好像算错复杂度了
查看原帖
求助:整体二分好像算错复杂度了
55201
clamee楼主2020/11/9 20:54

我算我这个整体二分的复杂度是 O(nlog22n)O(n\log^2_2n) 的,请问是哪里算挂了吗,T 了 4 个点。

#include<bits/stdc++.h>
using namespace std;
#define il inline 
#define rg register
il int read()
{
	int re=0,k=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')k=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){re=re*10+ch-48;ch=getchar();}
	return re*k;
}
il void write(int x)
{
	if(x<0)return putchar('-'),write(-x),void();
	if(x<10)return putchar(x+'0'),void();
	return write(x/10),putchar(x%10+'0'),void();
}
int n,m,q;
struct st{
	int x,y;
}Q[100005];
int ans[100005];
vector<st> e[100005];
int fa[100005],sz[100005];
int s[100005],ls;
int a[100005],b[100005];
int find(int x)
{
	if(x==fa[x])return x;
	return find(fa[x]);
}
void merge(int u,int v)
{
	if(u==v)return;
	if(sz[u]>sz[v])
		swap(u,v);
	fa[u]=v;
	sz[v]+=sz[u];
	s[++ls]=u;
}
void redo()
{
	sz[fa[s[ls]]]-=sz[s[ls]];
	fa[s[ls]]=s[ls];
	ls--;
}
void sol(int l,int r,int ll,int rr)
{
	if(l>r||ll>rr)return;
	if(l==r)
	{
		int las=ls;
		for(rg int j=0;j<e[l].size();j++)
		{
			merge(find(e[l][j].x),find(e[l][j].y));
		}

		for(rg int i=ll;i<=rr;i++)
		{
			if(find(Q[a[i]].x)==find(Q[a[i]].y))ans[a[i]]=l;
		}
		while(ls>las)redo();
		return;
	}
	int mid=(l+r)>>1;
	int las=ls;
	for(rg int i=r;i>mid;i--)
	{
		for(rg int j=0;j<e[i].size();j++)
		{
			merge(find(e[i][j].x),find(e[i][j].y));
		}
	}
	int t1=ll,t2=rr;
	for(rg int i=ll;i<=rr;i++)
	{
		if(find(Q[a[i]].x)==find(Q[a[i]].y))
			b[t2--]=a[i];
		else b[t1++]=a[i];
	}
	for(rg int i=ll;i<=rr;i++)
		a[i]=b[i];
	sol(l,mid,ll,t2);
	while(ls>las)redo();
	sol(mid+1,r,t1,rr);
}
signed main()
{
	n=read();m=read();
	for(rg int i=1;i<=n;i++)
		fa[i]=i;
	for(rg int i=1,u,v,w;i<=m;i++)
	{
		u=read();v=read();w=read();
		e[w].push_back((st){u,v});
	}
	q=read();
	for(rg int i=1,u,v;i<=q;i++)
	{
		Q[i].x=read();Q[i].y=read();
	}
	for(rg int i=1;i<=q;i++)
		ans[i]=-1,a[i]=i;
	sol(0,100000,1,q);
	for(rg int i=1;i<=q;i++)
	{
		write(ans[i]);puts("");
	}
}
2020/11/9 20:54
加载中...