又是TLE又是MLE
查看原帖
又是TLE又是MLE
474522
Anduin_Urien楼主2022/8/21 11:42

dalao帮忙看一下,这代码我服了

注释的dfs是TLE了,没注释的是MLE了

#include<bits/stdc++.h>
#define M 200000+5
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#define max(a,b) a>b?a:b
char buf<:1<<21:>,*p1=buf,*p2=buf;
template <typename L> inline void Read(L &X){
	char c=getchar();L zhi=0,fu=1;
	while(not isdigit(c)){if(c=='-')fu=-1;c=getchar();}
	while(isdigit(c)){zhi=(zhi<<1)+(zhi<<3)+c-'0';c=getchar();}
	X=fu*zhi;
}
template <typename L> inline void Write(L X){
  	if(X<0) putchar('-'),X=-X;
	if(X>9) Write(X/10);
	putchar(X%10^48);
}
using namespace std;
struct edge{
	int next,to,from;
}e[M];
int head[M];
int cnt,nt;
void add(int from,int to){
	e[++cnt].from=from;
	e[cnt].to=to;
	e[cnt].next=head[from];
	head[from]=cnt;
}
int n,m;
int dfn[M],low[M],ins[M];
int num[M];
stack<int>s;
int t;
int c[M],col;
int f[M];
/*void dfs(int u){
	f[u]=max(num[u-n],f[u]);
	for(int i=head[u];i;i=e[i].to){
		int v=e[i].to;
		if(f[v])f[u]=max(f[u],f[v]+num[u-n]);
		else{
			dfs(v);
		}
	}
}*/
int dfs(int u){
    if (!u||f[u]) return f[u];
    return f[u]=dfs(e[head[u]].to)+num[u-n];
}
void Tarjan(int u){
	dfn[u]=++t;
	low[u]=dfn[u];
	s.push(u);
	ins[u]=1;
	for(int i=head[u];i;i=e[i].next){
		if(!dfn[e[i].to]){
			Tarjan(e[i].to);
			if(low[u]>low[e[i].to])low[u]=low[e[i].to];
		}
		else{
			if(ins[e[i].to])low[u]=min(low[u],dfn[e[i].to]);
		}
	}
	if(dfn[u]==low[u]){
		int d=s.top();
		c[d]=++col;
		ins[d]=0;
		++num[c[d]];
		while(d!=u){
			s.pop();
			d=s.top();
			c[d]=col;
			ins[d]=0;
			++num[c[d]];
		}
	}
}
bool check(int x,int y){
	for(int i=head[x];i;i=e[i].next){
		if(e[i].to==y)return 0;
	}
	return 1;
}
int main(){
	Read(n);
	for(int i=1;i<=n;i++){
		int a;
		Read(a);
		add(i,a);
	}
	nt=cnt;
	for(int i=1;i<=n;i++){
		if(!dfn[i])Tarjan(i);
	}
	for(int i=1;i<=cnt;i++){
		int u=e[i].from,v=e[i].to;
		if(c[u]==c[v])continue;
		if(check(c[u]+n,c[v]+n))add(c[u]+n,c[v]+n);
	}
	for(int i=1;i<=col;i++){
		if(!f[i+n])dfs(i+n);
	}
	for(int i=1;i<=n;i++){
		Write(f[c[i]+n]);
		putchar('\n');
	}
	
	
	return 0;
}
2022/8/21 11:42
加载中...