第5个点TLE
#include<bits/stdc++.h>
using namespace std;
const int N=2e5;
int n,m,new_n;
int h1[N],h2[N],e[N],ne[N],w[N],idx;
void add(int h[],int a,int b,int c)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx;
w[idx++]=c;
}
int dfn[N],low[N],fu[N],fw[N],top[N],co[N],col,si[N],num;
int s[N],stot[N];
void build_circle(int x,int y,int z)
{
int sum=z;
co[x]=++col;
si[col]=1;
for(int k=y;k!=x;k=fu[k])
{
s[k]=sum;
sum+=fw[k];
}
s[x]=stot[x]=sum;
add(h2,x,++new_n,0);
for(int k=y;k!=x;k=fu[k])
{
stot[k]=sum;
add(h2,new_n,k,min(s[k],sum-s[k]));
}
}
void tarjan(int x,int f)
{
dfn[x]=low[x]=++num;
for(int i=h1[x];~i;i=ne[i])
{
if(e[i]==f) continue;
if(!dfn[e[i]])
{
fu[e[i]]=x;
fw[e[i]]=w[i];
tarjan(e[i],x);
low[x]=min(low[x],low[e[i]]);
}
else low[x]=min(low[x],dfn[e[i]]);
if(low[e[i]]<=dfn[x]) continue;
add(h2,x,e[i],w[i]);
}
for(int i=h1[x];~i;i=ne[i])
if(dfn[e[i]]>dfn[x]&&fu[e[i]]!=x) build_circle(x,e[i],w[i]);
}
int dis[N],d[N],ans;
int q[N];
int dfs(int x)
{
int d1=0,d2=0;
for(int i=h2[x];~i;i=ne[i])
{
int t=dfs(e[i])+w[i];
if(t>=d1) d2=d1,d1=t;
else if(t>d2) d2=t;
}
dis[x]=d1;
if(x<=n) ans=max(ans,d1+d2);
else
{
int sz=0;
d[sz++]=-1e9;
for(int i=h2[x];~i;i=ne[i]) d[sz++]=dis[e[i]];
for(int i=0;i<sz;i++) d[sz+i]=d[i];
int hh=0,tt=-1;
for(int i=0;i<sz*2;i++)
{
while(q[hh]+(sz>>1)<i&&hh<=tt) hh++;
if(hh<=tt) ans=max(ans,d[i]+i+d[q[hh]]-q[hh]);
while(d[q[tt]]+(i-q[tt])<=d[i]&&hh<=tt) tt--;
q[++tt]=i;
}
}
return dis[x];
}
int main() {
cin>>n>>m;
new_n=n;
memset(h1,-1,sizeof(h1));
memset(h2,-1,sizeof(h2));
for(int i=1;i<=m;i++)
{
int k;
cin>>k;
int x,y;
cin>>x;
for(int j=0;j<k-1;j++)
{
cin>>y;
add(h1,x,y,1);
add(h1,y,x,1);
x=y;
}
}
tarjan(1,0);
dfs(1);
cout<<ans;
}