Submission #968757


Source Code Expand

#include<bits/stdc++.h>
#define REP(i,m) for(int i=0;i<(m);++i)
#define REPN(i,m,in) for(int i=(in);i<(m);++i)
#define ALL(t) (t).begin(),(t).end()
#define CLR(a) memset((a),0,sizeof(a))
#define pb push_back
#define mp make_pair
#define fr first
#define sc second

using namespace std;


#ifdef DEB
#define dump(x)  cerr << #x << " = " << (x) << endl
#define prl cerr<<"called:"<< __LINE__<<endl
#define dumpR(x) cerr<<"\x1b[31m"<<#x<<" = " <<(x)<<"\x1b[39m"<<endl
#define dumpY(x) cerr<<"\x1b[33m"<<#x<<" = " <<(x)<<"\x1b[39m"<<endl
#define dumpG(x) cerr<<"\x1b[32m"<<#x<<" = " <<(x)<<"\x1b[39m"<<endl
template<class T> void debug(T a,T b){ for(;a!=b;++a) cerr<<*a<<' ';cerr<<endl;}
#else
#define dump(x) ;
#define dumpR(x) ;
#define dumpY(x) ;
#define dumpG(x) ;
#define prl ;
template<class T> void debug(T a,T b){ ;}
#endif

template<class T> void chmin(T& a,const T& b) { if(a>b) a=b; }
template<class T> void chmax(T& a,const T& b) { if(a<b) a=b; }

typedef long long int lint;
typedef pair<lint,lint> pi;

namespace std{
  template<class S,class T>
  ostream &operator <<(ostream& out,const pair<S,T>& a){
    out<<'('<<a.fr<<','<<a.sc<<')';
    return out;
  }
}

const int INF=5e8;
int n,X;
vector<pi> g[100005];


static const int MAXN=100005;
int cut[MAXN],size[MAXN],whole;
int root,rcost;
int getsize(int v,int p){
  size[v]=1;
  REP(i,g[v].size()){
    int to=g[v][i].fr;
    if(to!=p && cut[to]==0) size[v]+=getsize(to,v);
  }
  return size[v];
}
void getbestroot(int v,int p){
  int maxi=0;
  REP(i,g[v].size()){
    int to=g[v][i].fr;
    if(to!=p && cut[to]==0){
      getbestroot(to,v);
      maxi=max(maxi,size[to]);
    }
  }
  int rest=whole-size[v];
  maxi=max(maxi,rest);
  if(maxi<rcost){
    rcost=maxi;
    root=v;
  }
}
struct BIT{
  lint val[MAXN*2+2];
  int n;
  void init(int n_){
    n=1;
    while(n<n_) n<<=1;
    REP(i,n+1) val[i]=0;
  }
  void add(int k,int a){
    chmin(k,n);
    chmax(k,0);
    ++k;
    while(k<=n){
      val[k]+=a;
      k+=k&-k;
    }
  }
  int query(int k){ //[0,k)
    chmin(k,n);
    chmax(k,0);
    int res=0;
    while(k>0){
      res+=val[k];
      k-=k&-k;
    }
    return res;
  }
};

BIT bit,sum;


lint ans,incnt;
lint dfs2(int v,int p,int len){
  chmin(len,X+2);
  lint res=bit.query(X-len+1);
  ans+=sum.query(X-len+1)+res*len;
  dumpG(v);
  dump(res);dump(sum.query(X-len+1)+res*len);
  for(auto e:g[v]){
    if(e.fr==p || cut[e.fr]) continue;
    res+=dfs2(e.fr,v,len+e.sc);
  }
  return res;
}
void dfs3(int v,int p,int len,int sign){
  chmin(len,X+2);
  bit.add(len,sign);
  sum.add(len,len*sign);
  for(auto e:g[v]){
    if(e.fr==p || cut[e.fr]) continue;
    dfs3(e.fr,v,len+e.sc,sign);
  }
}

void dfs(int v){
  getsize(v,-1);
  if(size[v]==1) return;
  whole=size[v];
  rcost=INF;
  getbestroot(v,-1);
  v=root;

  lint res=0;
  cut[v]=1;
  REP(i,g[v].size()){
    int to=g[v][i].fr;
    if(cut[to]==0) dfs(to);
  }

  dumpR(v);
  bit.add(0,1);
  REP(i,g[v].size()){
    pi& e=g[v][i];
    if(cut[e.fr]==0){
      res+=dfs2(e.fr,v,e.sc);
      dfs3(e.fr,v,e.sc,1);
    }
  }

  bit.add(0,-1);
  REP(i,g[v].size()){
    pi& e=g[v][i];
    if(cut[e.fr]==0){
      dfs3(e.fr,v,e.sc,-1);
    }
  }
  cut[v]=0;
  incnt+=res;
  dump(incnt);
}


lint mini[100005],mxi[100005];
const lint INF2=1e18;
void rec(int v,int p){
  mini[v]=INF2;
  mxi[v]=0;
  for(auto e:g[v]){
    if(e.fr==p) continue;
    rec(e.fr,v);
    chmin(mini[v],e.sc);
    chmax(mxi[v],mxi[e.fr]+1);
  }
}
lint min_top[100005],max_top[100005];
int par[100005];

pi min1[100005],min2[100005],max1[100005],max2[100005];
void rec2(int v,int p){
  par[v]=p;
  pi min1={min_top[v],-1},min2={INF2,-1},max1={max_top[v],-1},max2={-1,-1};
  for(auto e:g[v]){
    if(e.fr==p) continue;
    pi mn=mp(e.sc,e.fr);
    pi mx=mp(mxi[e.fr]+1,e.fr);
    if(min1>mn){
      min2=min1;
      min1=mn;
    }else if(min2>mn) min2=mn;

    if(max1<mx){
      max2=max1;
      max1=mx;
    }else if(max2<mx) max2=mx;
  }
  ::min1[v]=min1;
  ::min2[v]=min2;
  ::max1[v]=max1;
  ::max2[v]=max2;
  dump(v);dump(min1);dump(min2);
  for(auto e:g[v]){
    if(e.fr==p) continue;
    if(e.fr==min1.sc) min_top[e.fr]=min2.fr+e.sc;
    else min_top[e.fr]=min1.fr+e.sc;

    if(e.fr==max1.sc) max_top[e.fr]=max2.fr+1;
    else max_top[e.fr]=max1.fr+1;
    rec2(e.fr,v);
  }
}

pi get(int a,int b){
  if(par[a]==b){
    return mp(mini[a],mxi[a]);
  }else{
    pi res;
    if(min1[a].sc==b) res.fr=min2[a].fr;
    else res.fr=min1[a].fr;
    if(max1[a].sc==b) res.sc=max2[a].fr;
    else res.sc=max1[a].fr;
    return res;
  }
}
int calc(pi a){
  return min(a.fr+X,(a.sc>=2?X:INF)+(lint)X);
}


int main(){
  cin>>n>>X;
  bit.init(X+3);
  sum.init(X+3);

  lint dif=0;
  vector<pair<pi,int> >es;
  REP(i,n-1){
    int a,b,c;scanf("%d%d%d",&a,&b,&c);--a;--b;

    if(c>X){
      es.pb(mp(mp(a,b),c));
    }
    g[a].pb(mp(b,c));
    g[b].pb(mp(a,c));
  }
  if(n==2){
    cout<<g[0][0].sc<<endl;
    return 0;
  }
  if(es.size()>0){
    rec(0,-1);
    max_top[0]=-1;
    min_top[0]=INF2;
    rec2(0,-1);
    for(auto e:es){
      int a=e.fr.fr,b=e.fr.sc,c=e.sc;

      pi A=get(a,b),B=get(b,a);
      dump(A);dump(B);
      dif+=min({calc(A),calc(B),c})-X;
    }
    debug(ALL(es));
    dump(dif);
  }

  dfs(0);

  dump(ans);dump(incnt);
  lint res=ans+(n*(lint)(n-1)/2-incnt)*X;
  res+=dif;
  cout<<res<<endl;
  return 0;
}



Submission Info

Submission Time
Task D - 道路網
User hogloid
Language C++14 (GCC 5.4.1)
Score 1200
Code Size 5616 Byte
Status AC
Exec Time 396 ms
Memory 20776 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:244:39: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
     int a,b,c;scanf("%d%d%d",&a,&b,&c);--a;--b;
                                       ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1200 / 1200
Status
AC × 2
AC × 46
Set Name Test Cases
Sample 00_example_01.txt, 00_example_02.txt
All 00_example_01.txt, 00_example_02.txt, 10_rand_01.txt, 10_rand_02.txt, 10_rand_03.txt, 10_rand_04.txt, 10_rand_05.txt, 20_k-ary_01.txt, 20_k-ary_02.txt, 20_k-ary_03.txt, 20_k-ary_04.txt, 20_k-ary_05.txt, 20_k-ary_06.txt, 20_k-ary_07.txt, 20_k-ary_08.txt, 20_k-ary_09.txt, 20_k-ary_10.txt, 30_star_01.txt, 30_star_02.txt, 30_star_03.txt, 30_star_04.txt, 30_star_05.txt, 40_pseudostar_01.txt, 40_pseudostar_02.txt, 40_pseudostar_04.txt, 40_pseudostar_05.txt, 40_pseudostar_06.txt, 50_line_01.txt, 50_line_02.txt, 50_line_03.txt, 60_max_01.txt, 60_max_02.txt, 60_max_03.txt, 60_max_04.txt, 70_hand_01.txt, 70_hand_02.txt, 71_hand_01.txt, 72_hand_01.txt, 80_kill2X_01.txt, 80_kill2X_02.txt, 80_kill2X_03.txt, 80_kill2X_04.txt, 80_kill2X_05.txt, 80_kill2X_06.txt, 80_kill2X_07.txt, 80_kill2X_08.txt
Case Name Status Exec Time Memory
00_example_01.txt AC 5 ms 2688 KB
00_example_02.txt AC 5 ms 2688 KB
10_rand_01.txt AC 5 ms 2688 KB
10_rand_02.txt AC 6 ms 2688 KB
10_rand_03.txt AC 5 ms 2560 KB
10_rand_04.txt AC 6 ms 2688 KB
10_rand_05.txt AC 6 ms 2688 KB
20_k-ary_01.txt AC 352 ms 10880 KB
20_k-ary_02.txt AC 324 ms 9344 KB
20_k-ary_03.txt AC 321 ms 9344 KB
20_k-ary_04.txt AC 182 ms 9472 KB
20_k-ary_05.txt AC 162 ms 11648 KB
20_k-ary_06.txt AC 90 ms 9600 KB
20_k-ary_07.txt AC 83 ms 10240 KB
20_k-ary_08.txt AC 76 ms 8960 KB
20_k-ary_09.txt AC 81 ms 10112 KB
20_k-ary_10.txt AC 86 ms 9984 KB
30_star_01.txt AC 79 ms 19812 KB
30_star_02.txt AC 80 ms 19812 KB
30_star_03.txt AC 84 ms 19428 KB
30_star_04.txt AC 85 ms 18856 KB
30_star_05.txt AC 88 ms 20388 KB
40_pseudostar_01.txt AC 84 ms 18416 KB
40_pseudostar_02.txt AC 86 ms 19812 KB
40_pseudostar_04.txt AC 92 ms 20140 KB
40_pseudostar_05.txt AC 92 ms 19624 KB
40_pseudostar_06.txt AC 89 ms 20008 KB
50_line_01.txt AC 393 ms 17920 KB
50_line_02.txt AC 388 ms 17920 KB
50_line_03.txt AC 395 ms 17920 KB
60_max_01.txt AC 339 ms 10496 KB
60_max_02.txt AC 348 ms 10496 KB
60_max_03.txt AC 285 ms 10496 KB
60_max_04.txt AC 321 ms 10496 KB
70_hand_01.txt AC 7 ms 4608 KB
70_hand_02.txt AC 5 ms 2560 KB
71_hand_01.txt AC 273 ms 10496 KB
72_hand_01.txt AC 396 ms 17920 KB
80_kill2X_01.txt AC 81 ms 19748 KB
80_kill2X_02.txt AC 82 ms 19748 KB
80_kill2X_03.txt AC 82 ms 19748 KB
80_kill2X_04.txt AC 82 ms 19748 KB
80_kill2X_05.txt AC 84 ms 20776 KB
80_kill2X_06.txt AC 82 ms 20136 KB
80_kill2X_07.txt AC 84 ms 19752 KB
80_kill2X_08.txt AC 86 ms 20264 KB