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;
}