莫名T了(
查看原帖
莫名T了(
147401
koishi_offical楼主2021/4/28 14:00

第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;
}
2021/4/28 14:00
加载中...