Submission #1132887


Source Code Expand

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<cassert>
#define PB push_back
#define MP make_pair
#define sz(v) (in((v).size()))
#define forn(i,n) for(in i=0;i<(n);++i)
#define forv(i,v) forn(i,sz(v))
#define fors(i,s) for(auto i=(s).begin();i!=(s).end();++i)
#define all(v) (v).begin(),(v).end()
using namespace std;
typedef long long in;
typedef vector<in> VI;
typedef vector<VI> VVI;
const in mdl=1000000007;
VVI egs;
in n;
VVI wy;
in wys(in u, in pr, in dnlim, in rad){
  in& tp=wy[u][dnlim];
  if(tp!=-1)
    return tp;
  tp=1;
  in tw;
  forv(i,egs[u]){
    if(egs[u][i]==pr)
      continue;
    tw=0;
    if(dnlim)
      tw+=wys(egs[u][i],u,dnlim-1,rad-1);
    if(dnlim!=rad)
      tw+=wys(egs[u][i],u,dnlim,rad-1);
    tp=tp*tw%mdl;
  }
  return tp;
}
VI dglft;
VI act;
VI trn;
int main(){
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin>>n;
  egs.resize(n);
  dglft.resize(n);
  act.resize(n,1);
  trn.resize(n);
  in ta,tb;
  forn(z,n-1){
    cin>>ta>>tb;
    --ta;
    --tb;
    egs[ta].PB(tb);
    egs[tb].PB(ta);
    ++dglft[ta];
    ++dglft[tb];
  }
  VI trm;
  in ct=0;
  forn(i,n){
    if(dglft[i]==1){
      trn[i]=ct;
      trm.PB(i);
      act[i]=0;
    }
  }
  wy.resize(n,VI(n+2,-1));
  in cd;
  while(1){
    ++ct;
    VI ttrm;
    forv(i,trm){
      forv(j,egs[trm[i]]){
	cd=egs[trm[i]][j];
	if(act[cd]){
	  --dglft[cd];
	  if(dglft[cd]<=1){
	    act[cd]=0;
	    trn[cd]=ct;
	    ttrm.PB(cd);
	  }
	}
      }
    }
    trm=ttrm;
    if(trm.empty())
      break;
  }
  in mxd=-1;
  VI cent;
  forn(i,n){
    if(trn[i]>mxd){
      mxd=trn[i];
      cent.clear();
    }
    if(trn[i]==mxd)
      cent.PB(i);
  }
  in rad=mxd;
  bool centeg=(sz(cent)==2);
  assert(sz(cent)==1 || sz(cent)==2);
  in sm=0;
  if(centeg){
    forn(xx,2){
      forn(zz,2){
	forn(dnlim,rad+1){
	  in ls=wys(cent[0],cent[1],dnlim,rad);
	  in rs=wys(cent[1],cent[0],dnlim+zz,rad+1);
	  sm+=ls*rs;
	  sm%=mdl;
	}
      }
      forn(i,n){
	forv(j,wy[i])
	  wy[i][j]=-1;
      }
      swap(cent[0],cent[1]);
    }
    forn(xx,2){
      forn(dnlim,rad+1){
	for(in z=0;z<2 && dnlim+z<=rad;++z){
	  in ls=wys(cent[0],cent[1],dnlim,rad);
	  in rs=wys(cent[1],cent[0],dnlim+z,rad);
	  sm-=ls*rs;
	  sm%=mdl;
	}
      }
      forn(i,n){
	forv(j,wy[i])
	  wy[i][j]=-1;
      }
      swap(cent[0],cent[1]);
    }
    sm%=mdl;
    sm+=mdl;
    sm%=mdl;
  }
  else{
    forn(dnlim,rad+1){
      sm+=wys(cent[0],cent[0],dnlim,rad);
      sm%=mdl;
    }
  }
  cout<<sm<<endl;
  return 0;
}

Submission Info

Submission Time
Task D - Oriented Tree
User w4yneb0t
Language C++14 (GCC 5.4.1)
Score 1800
Code Size 2682 Byte
Status AC
Exec Time 36 ms
Memory 8320 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1800 / 1800
Status
AC × 4
AC × 33
Set Name Test Cases
Sample 0_00.txt, 0_01.txt, 0_02.txt, 0_03.txt
All 0_00.txt, 0_01.txt, 0_02.txt, 0_03.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 1_18.txt, 1_19.txt, 1_20.txt, 1_21.txt, 1_22.txt, 1_23.txt, 1_24.txt, 1_25.txt, 1_26.txt, 1_27.txt, 1_28.txt
Case Name Status Exec Time Memory
0_00.txt AC 1 ms 256 KB
0_01.txt AC 1 ms 256 KB
0_02.txt AC 1 ms 256 KB
0_03.txt AC 1 ms 256 KB
1_00.txt AC 1 ms 256 KB
1_01.txt AC 13 ms 8192 KB
1_02.txt AC 36 ms 8320 KB
1_03.txt AC 5 ms 8192 KB
1_04.txt AC 7 ms 8192 KB
1_05.txt AC 5 ms 8064 KB
1_06.txt AC 8 ms 8192 KB
1_07.txt AC 5 ms 8064 KB
1_08.txt AC 9 ms 8064 KB
1_09.txt AC 9 ms 8064 KB
1_10.txt AC 6 ms 7936 KB
1_11.txt AC 12 ms 7936 KB
1_12.txt AC 6 ms 7680 KB
1_13.txt AC 19 ms 8192 KB
1_14.txt AC 10 ms 8064 KB
1_15.txt AC 11 ms 8192 KB
1_16.txt AC 12 ms 8192 KB
1_17.txt AC 5 ms 8192 KB
1_18.txt AC 5 ms 8064 KB
1_19.txt AC 5 ms 8064 KB
1_20.txt AC 7 ms 7936 KB
1_21.txt AC 5 ms 8192 KB
1_22.txt AC 5 ms 8192 KB
1_23.txt AC 5 ms 8064 KB
1_24.txt AC 5 ms 8064 KB
1_25.txt AC 5 ms 8192 KB
1_26.txt AC 5 ms 7808 KB
1_27.txt AC 5 ms 8064 KB
1_28.txt AC 5 ms 8064 KB