有大佬帮忙看看这个程序的时间复杂度是多少吗?
  • 板块学术版
  • 楼主QCurium
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/10/4 14:59
  • 上次更新2023/11/2 15:49:47
查看原帖
有大佬帮忙看看这个程序的时间复杂度是多少吗?
363995
QCurium楼主2023/10/4 14:59

RT

#include<bits/stdc++.h> 
#define N 200005
#define M 500005
using namespace std;
namespace fastio
{
    struct reader
    {
        template<typename T>reader&operator>>(T&x)
        {
            char c=getchar();short f=1;
            while(c<'0'||c>'9')
                {if(c=='-')f*=-1;c=getchar();}
            x=0;
            while(c>='0'&&c<='9')
                x=(x<<1)+(x<<3)+(c^48),c=getchar();
            x*=f;
            return *this;
        }
    }cin;
    struct writer
    {
        template<typename T>writer&operator<<(T x)
        {
            if(x==0)
                return putchar('0'),*this;
            if(x<0)
                putchar('-'),x=-x;
            static int sta[45];int top=0;
            while(x)
                sta[++top]=x%10,x/=10;
            while(top)
                putchar(sta[top]+'0'),--top;
            return *this;
        }
    }cout;
    #define cin fastio::cin
    #define cout fastio::cout
};
int n,m,qq,cnt=0,tot=1,cnt1=0;
int fa[N],ans[M],dep[N],siz[N],son[N],top[N],dfn[N],head[N],w[N];
map<pair<int,int>,int> db;
queue<pair<int,int> > qqq;
struct edge{
	int to,next;
}e[M<<1];
struct tu{
	int u,v;
}t[M];
struct qury{
	int c,a,b;
}q[M];
struct node{
	int l,r;
	int sum,tg;
}a[N<<2];
///////////////////////////////////////
int find(int x){
	if(fa[x]==x)
		return x;
	else
		return fa[x]=find(fa[x]);
}
void ade(int u,int v){
	e[tot]=(edge){v,head[u]};
	head[u]=tot++;
	e[tot]=(edge){u,head[v]}; 
	head[v]=tot++;
}
void dfs1(int nw,int f){
	dep[nw]=dep[f]+1;
	fa[nw]=f;
	siz[nw]=1;
	int qwe=-1;
	for(int i=head[nw];i>0;i=e[i].next){
		int er=e[i].to;
		if(er==f)
			continue;
		dfs1(er,nw);
		siz[nw]+=siz[er];
		if(qwe<siz[er]){
			qwe=siz[er];
			son[nw]=er;
		}
	}
}
void dfs2(int nw,int t){
	top[nw]=t;
	dfn[nw]=++cnt;
	if(!son[nw])
		return ;
	dfs2(son[nw],t);
	w[dfn[son[nw]]]=1;
	for(int i=head[nw];i>0;i=e[i].next){
		int er=e[i].to;
		if(er==son[nw]||er==fa[nw])
			continue;
		dfs2(er,er);
		w[dfn[er]]=1;
	}
}
///////////////////////////////////////
void push_up(int aa){
	a[aa].sum=a[aa*2].sum+a[aa*2+1].sum;
	return ;
}
void push_down(int aa){
	if(a[aa].tg){
		a[aa*2].sum=0;
		a[aa*2+1].sum=0;
		a[aa*2].tg=1;
		a[aa*2+1].tg=1;
		a[aa].tg=0;
	}
	return ;
}
void build(int aa,int l,int r){
	a[aa].l=l;
	a[aa].r=r;
	a[aa].tg=0;
	if(l==r){
		a[aa].sum=w[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(aa*2,l,mid);
	build(aa*2+1,mid+1,r);
	push_up(aa);
	return ;
}
void modify(int aa,int l,int r){
	if(a[aa].sum==0)
		return ;
	if(a[aa].l>=l&&a[aa].r<=r){
		a[aa].sum=0;
		a[aa].tg=1;
		return ;
	}
	push_down(aa);
	int mid=(a[aa].l+a[aa].r)>>1;
	if(l<=mid)
		modify(aa*2,l,r);
	if(r>mid)
		modify(aa*2+1,l,r);
	push_up(aa);
	return ;
}
int query(int aa,int l,int r){
	if(a[aa].sum==0)
		return 0;
	if(a[aa].l>=l&&a[aa].r<=r)
		return a[aa].sum;
	push_down(aa);
	int sd=0,mid=(a[aa].l+a[aa].r)>>1;
	if(l<=mid)
		sd+=query(aa*2,l,r);
	if(r>mid)
		sd+=query(aa*2+1,l,r);
	push_up(aa);
	return sd; 
}
///////////////////////////////////////
void mchain(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])
			swap(x,y);
		modify(1,dfn[top[x]],dfn[x]);
		x=fa[top[x]];
	}
	if(x==y)
		return ;
	if(dep[x]>dep[y])
		swap(x,y);
	modify(1,dfn[x]+1,dfn[y]);
	return ;
}
int qchain(int x,int y){
	int sd=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])
			swap(x,y);
		sd+=query(1,dfn[top[x]],dfn[x]);
		x=fa[top[x]];
	}
	if(x==y)
		return sd;
	if(dep[x]>dep[y]) 
		swap(x,y);
	sd+=query(1,dfn[x]+1,dfn[y]);
	return sd;
}
///////////////////////////////////////
int main(){
//	freopen("lane.in","r",stdin);
//	freopen("lane.out","w",stdout);
	cin>>n>>m>>qq;
	for(int i=1;i<=n;i++)
		fa[i]=i;
	for(int i=1;i<=m;i++){
		int aaa,bbb;
		cin>>aaa>>bbb;
		if(aaa>bbb)
			swap(aaa,bbb);
		t[i].u=aaa;
		t[i].v=bbb;
		db[make_pair(aaa,bbb)]=1;
	}
	for(int i=1;i<=qq;i++){
		cin>>q[i].c>>q[i].a>>q[i].b;
		if(q[i].a>q[i].b)
			swap(q[i].a,q[i].b);
		if(!q[i].c)
			db[make_pair(q[i].a,q[i].b)]=0;
	}
	for(int i=1;i<=m;i++){
		int as=find(t[i].u);
		int bs=find(t[i].v);
		if(db[make_pair(t[i].u,t[i].v)]){
			if(as==bs)
				qqq.push(make_pair(t[i].u,t[i].v));
			else{
				fa[as]=bs;
				ade(t[i].u,t[i].v);
			}
		}
	}
	dfs1(1,1);
	dfs2(1,1);
	build(1,1,n);
	while(!qqq.empty()){
		mchain(qqq.front().first,qqq.front().second);
		qqq.pop();
	}
	for(int i=qq;i>=1;i--){
		if(q[i].c==1){
			cnt1++;
			ans[cnt1]=qchain(q[i].a,q[i].b);
		}
		else
			mchain(q[i].a,q[i].b);
	}
	for(int i=cnt1;i>=1;i--){
		cout<<ans[i];
		putchar('\n');
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}

2023/10/4 14:59
加载中...