結果

問題 No.1002 Twotone
ユーザー sugarrrsugarrr
提出日時 2020-03-01 14:56:17
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 1,390 ms / 5,000 ms
コード長 3,237 bytes
コンパイル時間 2,383 ms
コンパイル使用メモリ 194,256 KB
実行使用メモリ 70,624 KB
最終ジャッジ日時 2024-10-13 20:41:33
合計ジャッジ時間 18,705 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 12 ms
17,408 KB
testcase_01 AC 12 ms
17,536 KB
testcase_02 AC 12 ms
17,408 KB
testcase_03 AC 336 ms
27,008 KB
testcase_04 AC 465 ms
30,080 KB
testcase_05 AC 480 ms
29,824 KB
testcase_06 AC 12 ms
17,280 KB
testcase_07 AC 291 ms
36,440 KB
testcase_08 AC 513 ms
47,612 KB
testcase_09 AC 517 ms
50,304 KB
testcase_10 AC 12 ms
17,408 KB
testcase_11 AC 552 ms
38,700 KB
testcase_12 AC 802 ms
44,444 KB
testcase_13 AC 817 ms
44,668 KB
testcase_14 AC 12 ms
17,536 KB
testcase_15 AC 395 ms
36,360 KB
testcase_16 AC 867 ms
52,532 KB
testcase_17 AC 858 ms
50,132 KB
testcase_18 AC 12 ms
17,536 KB
testcase_19 AC 572 ms
34,560 KB
testcase_20 AC 716 ms
42,496 KB
testcase_21 AC 736 ms
41,856 KB
testcase_22 AC 13 ms
17,536 KB
testcase_23 AC 686 ms
50,516 KB
testcase_24 AC 1,375 ms
70,624 KB
testcase_25 AC 1,390 ms
70,620 KB
testcase_26 AC 13 ms
17,408 KB
testcase_27 AC 125 ms
33,884 KB
testcase_28 AC 239 ms
41,432 KB
testcase_29 AC 195 ms
41,440 KB
testcase_30 AC 13 ms
17,408 KB
testcase_31 AC 190 ms
40,976 KB
testcase_32 AC 238 ms
41,176 KB
testcase_33 AC 195 ms
41,180 KB
testcase_34 AC 1,207 ms
68,136 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

//#include <bits/stdc++.h>
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
//#include "boost/multiprecision/cpp_int.hpp"
//typedef boost::multiprecision::cpp_int ll;
typedef long double dd;
#define i_7 (ll)(1E9+7)
//#define i_7 998244353
#define i_5 i_7-2
ll mod(ll a){
    ll c=a%i_7;
    if(c>=0)return c;
    return c+i_7;
}
typedef pair<ll,ll> l_l;
typedef pair<dd,dd> d_d;
ll inf=(ll)1E16;
#define rep(i,l,r) for(ll i=l;i<=r;i++)
#define pb push_back
ll max(ll a,ll b){if(a<b)return b;else return a;}
ll min(ll a,ll b){if(a>b)return b;else return a;}
void Max(ll &pos,ll val){pos=max(pos,val);}//Max(dp[n],dp[n-1]);
void Min(ll &pos,ll val){pos=min(pos,val);}
void Add(ll &pos,ll val){pos=mod(pos+val);}
dd EPS=1E-9;
#define fastio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fi first
#define se second
////////////////////////////

ll n,k;
#define N 200005
vector<l_l>v[N];
ll sz[N];
bool used[N];
ll szdfs(ll x,ll p){
    sz[x]=1;
    for(auto z:v[x]){
        ll y=z.fi;
        if(y==p||used[y])continue;
        sz[x]+=szdfs(y,x);
    }
    return sz[x];
}
ll centroid(ll x,ll p,ll total){
    for(auto z:v[x]){
        ll y=z.fi;
        if(y==p||used[y])continue;
        if(2*sz[y]>total)return centroid(y,x,total);
    }
    return x;
}
/////

bool over[N];
set<ll>col[N];
ll ans=0;
ll calc(vector<ll>t){
    ll res=0;
    map<ll,ll>s1,s2;
    ll c1=0,c2=0;
    map<l_l,ll>same;
    bool zero=false;
    for(auto u:t){
        if(col[u].size()==1){
            for(auto x:col[u]){
                s1[x]++;
            }
            c1++;
        }else if(col[u].size()==2){
            ll z[2];ll i=0;
            for(auto x:col[u]){
                s2[x]++;
                z[i]=x;i++;
            }
            same[l_l(z[0],z[1])]++;
            c2++;
        }else if(col[u].size()==0){
            zero=true;
        }
    }
    if(zero)res=c2*2;
    for(auto u:s1){
        res+=u.se*(c1-u.se);
        res+=2*u.se*s2[u.fi];
    }
    for(auto u:same){
        res+=u.se*(u.se-1);
    }
    return res;
}
void dfs(vector<ll>&t,ll x,ll p){
    t.pb(x);
    for(auto z:v[x]){
        ll y=z.fi;ll c=z.se;
        if(y==p||used[y])continue;
        if(over[x]){
            over[y]=true;continue;
        }
        //col[y].clear();
        col[y]=col[x];col[y].insert(c);
        if(col[y].size()>2){
            over[y]=true;
            continue;
        }
        over[y]=false;
        dfs(t,y,x);
    }
}
void solve(ll x,ll p){
    szdfs(x,p);
    x=centroid(x, p, sz[x]);
    used[x]=true;
    vector<ll>T;T.pb(x);
    col[x].clear();
    over[x]=false;
    for(auto z:v[x]){
        ll y=z.fi;ll c=z.se;
        vector<ll>t;
        if(y==p||used[y])continue;
        over[y]=false;
        col[y].clear();
        col[y].insert(c);
        dfs(t,y,x);
        ans-=calc(t);
        T.insert(T.end(),t.begin(),t.end());
    }
    ans+=calc(T);
    for(auto z:v[x]){
        ll y=z.fi;
        if(y==p||used[y])continue;
        solve(y,x);
    }
}
int main(){fastio
    cin>>n>>k;
    rep(i,1,n-1){
        ll a,b,c;cin>>a>>b>>c;
        v[a].pb(l_l(b,c));
        v[b].pb(l_l(a,c));
    }
    solve(1,-1);
    cout<<ans/2<<endl;
    return 0;
}
/*
4 0
1 2 1
2 3 2
3 4 3
*/
0