TLE求助
查看原帖
TLE求助
1020581
The_outcast_person楼主2024/8/6 16:43

这代码一直 TLE on #16。蒟蒻已经调一下午了。(再改就要跟题解一样了)

#include<bits/stdc++.h>
#define int long long
#define il inline
#define pii pair<int,int>
#define mk make_pair
#define mod 1000000007
using namespace std;
il int rd(){
    int jya=0,tl=1;char jyt=getchar();
    while(!isdigit(jyt)){if(jyt=='-')tl=-1;jyt=getchar();}
    while(isdigit(jyt)){jya=(jya<<1)+(jya<<3)+(jyt-'0');jyt=getchar();}
    return jya*tl;
}
il void wr(int jjy){
    if(jjy<0)putchar('-'),jjy=-jjy;
    if(jjy>9)wr(jjy/10);
    putchar(jjy%10+48);
}
const int JYAAKIOI=1145141919810;
struct Edge{
	int to,next;
}e[500086];
struct node{
	int x,y;
}b[200086];
int n,m,u,v,low[200086],dfn[200086],now,cnt,scc[200086],mm,sc[200086],noww;
int up[200086],down[200086],po[200086],d[200086],f[200086][26],q,head[200086],len;
vector<int>g[200086];
stack<int>st;
bool vis[500086];
il void add_edge(int u,int v){
    e[++len]=(Edge){v,head[u]};
    head[u]=len;
}
il void tj(int u,int fa){
	low[u]=dfn[u]=++now;
	st.push(u);
	for(int i=head[u];i!=-1;i=e[i].next){
		int v=e[i].to;
		if(v==fa)continue;
		if(!dfn[v]){
			tj(v,u);
			low[u]=min(low[u],low[v]);
			if(low[v]>dfn[u])vis[i]=vis[i^1]=1;
		}
		else low[u]=min(low[u],dfn[v]);
	}
}
il void dfs1(int u){
	scc[u]=cnt;
	for(int i=head[u];i!=-1;i=e[i].next){
		int v=e[i].to;
		if(scc[v]||vis[i])continue;
		dfs1(v);
	}
}
il void dfs(int x,int fa){
	sc[x]=noww;
	f[x][0]=fa;d[x]=d[fa]+1;
	for(int i=1;i<=po[d[x]];++i)f[x][i]=f[f[x][i-1]][i-1];
	for(auto v:g[x])if(v!=fa)dfs(v,x);
}
il int lca(int x,int y){
	if(d[x]<d[y])swap(x,y);
	while(d[x]>d[y])x=f[x][po[d[x]-d[y]]-1];
	if(x==y)return x;
	for(int k=po[d[x]-1];k>=0;--k){
		if(f[x][k]!=f[y][k])x=f[x][k],y=f[y][k];
	}
	return f[x][0];
}
il bool ck(int u,int fa){
	for(int v:g[u]){
		if(v==fa)continue;
		if(!ck(v,u)||(up[v]&&down[v]))return 0;
		up[u]+=up[v];
		down[u]+=down[v];
	}
	return 1;
}
signed main(){
	memset(head,-1,sizeof head);
	n=rd();m=rd();q=rd();
	for(int i=1;i<=m;++i){
		u=rd();v=rd();
		add_edge(u,v);
		add_edge(v,u);
	}
	for(int i=1;i<=n;++i){
		//cout<<1;
		if(!dfn[i]){
			
			tj(i,0);
		}
	}
	//cout<<cnt;
	for(int i=1;i<=n;++i){
		if(!scc[i]){
			++cnt;
			dfs1(i);
		}
	}
		
	for(int i=1;i<=n;++i){
		for(int j=head[i];j!=-1;j=e[j].next){
			int v=e[j].to;
			if(scc[i]<scc[v]){
				g[scc[i]].push_back(scc[v]);
				g[scc[v]].push_back(scc[i]);
			}
		}
		//cout<<scc[i]<<" ";
	}
	for(int i=1;i<=n;++i)po[i]=po[i-1]+(1<<po[i-1]==i);
	for(int i=1;i<=cnt;++i){
		if(!sc[i]){
			++noww;//cout<<2;
			dfs(i,0);
		}
	}
	//cout<<noww;
	while(q--){
		u=rd();v=rd();
		if(scc[u]!=scc[v]){
			b[++mm].x=scc[u];
			b[mm].y=scc[v];
		}
	}
	//cout<<mm;
	for(int i=1;i<=mm;++i){
		u=b[i].x,v=b[i].y;
		if(sc[u]!=sc[v]){
			printf("No");
			return 0;
		}
		int lac=lca(u,v);
		//cout<<lac<<endl<<endl;
		++up[u],++down[v];
		--up[lac],--down[lac];
	}
	for(int i=1;i<=cnt;++i){
		if(!f[i][0]&&!ck(i,0)){
			printf("No");
			return 0;
		}
	}
	printf("Yes");
    return 0;
}
2024/8/6 16:43
加载中...