結果
| 問題 |
No.1002 Twotone
|
| コンテスト | |
| ユーザー |
tute7627
|
| 提出日時 | 2020-02-28 22:22:58 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2,297 ms / 5,000 ms |
| コード長 | 4,812 bytes |
| コンパイル時間 | 2,286 ms |
| コンパイル使用メモリ | 201,420 KB |
| 実行使用メモリ | 91,520 KB |
| 最終ジャッジ日時 | 2024-10-13 17:54:51 |
| 合計ジャッジ時間 | 15,715 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 33 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define lfs cout<<fixed<<setprecision(10)
#define ALL(a) (a).begin(),(a).end()
#define ALLR(a) (a).rbegin(),(a).rend()
#define spa << " " <<
#define fi first
#define se second
#define MP make_pair
#define MT make_tuple
#define PB push_back
#define EB emplace_back
#define rep(i,n,m) for(ll i = (n); i < (ll)(m); i++)
#define rrep(i,n,m) for(ll i = (m) - 1; i >= (ll)(n); i--)
using ll = long long;
using ld = long double;
const ll MOD = 1e9+7;
//const ll MOD = 998244353;
const ll INF = 1e18;
using P = pair<ll, ll>;
template<typename T>
bool chmin(T &a,T b){if(a>b){a=b;return true;}else return false;}
template<typename T>
bool chmax(T &a,T b){if(a<b){a=b;return true;}else return false;}
ll median(ll a,ll b, ll c){return a+b+c-max({a,b,c})-min({a,b,c});}
void ans1(bool x){if(x) cout<<"Yes"<<endl;else cout<<"No"<<endl;}
void ans2(bool x){if(x) cout<<"YES"<<endl;else cout<<"NO"<<endl;}
void ans3(bool x){if(x) cout<<"Yay!"<<endl;else cout<<":("<<endl;}
template<typename T1,typename T2>
void ans(bool x,T1 y,T2 z){if(x)cout<<y<<endl;else cout<<z<<endl;}
template<typename T>
void debug(vector<vector<T>>&v,ll h,ll w){for(ll i=0;i<h;i++)
{cout<<v[i][0];for(ll j=1;j<w;j++)cout spa v[i][j];cout<<endl;}};
void debug(vector<string>&v,ll h,ll w){for(ll i=0;i<h;i++)
{for(ll j=0;j<w;j++)cout<<v[i][j];cout<<endl;}};
template<typename T>
void debug(vector<T>&v,ll n){if(n!=0)cout<<v[0];
for(ll i=1;i<n;i++)cout spa v[i];cout<<endl;};
template<typename T>
vector<vector<T>>vec(ll x, ll y, T w){
vector<vector<T>>v(x,vector<T>(y,w));return v;}
ll gcd(ll x,ll y){ll r;while(y!=0&&(r=x%y)!=0){x=y;y=r;}return y==0?x:y;}
vector<ll>dx={1,0,-1,0,1,1,-1,-1};
vector<ll>dy={0,1,0,-1,1,-1,1,-1};
template<typename T>
vector<T> make_v(size_t a,T b){return vector<T>(a,b);}
template<typename... Ts>
auto make_v(size_t a,Ts... ts){
return vector<decltype(make_v(ts...))>(a,make_v(ts...));
}
ostream &operator<<(ostream &os, pair<ll, ll>&p){
return os << p.first << " " << p.second;
}
struct edge{
ll to=0,col=0;
edge(){};
edge(ll t,ll c):to(t),col(c){};
};
struct CentroidDecomposition{
ll n;
const vector<vector<edge>> &g;
vector<bool> used;//既に重心として選ばれたか
vector<ll> sub;//部分木のサイズ
CentroidDecomposition(const vector<vector<edge>> &g):g(g){
n = g.size();
sub.assign(g.size(), 0);
used.assign(g.size(), false);
}
ll search_centroid(ll root){
return dfs_search(root, -1, dfs_sz(root, -1) / 2 );
}
ll dfs_sz(ll k, ll par){
sub[k] = 1;
for(auto e:g[k]){
if(e.to == par || used[e.to])continue;
sub[k] += dfs_sz(e.to, k);
}
return sub[k];
}
ll dfs_search(ll k, ll par, ll mid){
for(auto e:g[k]){
if(e.to == par || used[e.to])continue;
if(sub[e.to] > mid)return dfs_search(e.to, k, mid);
}
return k;
}
ll answer = 0;
void run(){
//何か前処理を書くなら
solve(0);
}
void solve(ll root){
ll cent = search_centroid(root);
ll size = sub[root];
used[cent] = true;
vector<map<P,ll>>mp;
map<P,ll>sum;
for(auto e:g[cent]){
if(!used[e.to]){
mp.emplace_back();
dfs(e.to,-1,mp.back(),MP(e.col,-1));
for(auto z:mp.back())sum[z.fi]+=z.se;
}
}
//cout<<root<<endl;
//cout<<"sumtest"<<endl;
//for(auto z:sum)cout<<z.fi.fi spa z.fi.se spa z.se<<endl;
for(auto mp2:mp){
for(auto z:mp2){
sum[z.fi]-=z.se;
}
for(auto z:mp2){
if(z.fi.fi==-1)continue;
if(z.fi.se==-1){
answer+=sum[MP(-1,z.fi.fi)]*z.se;
answer+=sum[MP(-1,-1)]*z.se;
answer-=sum[MP(z.fi.fi,-1)]*z.se;
}
else{
answer+=sum[z.fi]*z.se;
answer+=sum[MP(z.fi.fi,-1)]*z.se;
answer+=sum[MP(z.fi.se,-1)]*z.se;
answer+=z.se*2;
}
}
for(auto z:mp2){
sum[z.fi]+=z.se;
}
}
//cout<<"answer" spa answer<<endl;
for(auto e:g[cent]){
if(!used[e.to]){
solve(e.to);
}
}
used[cent] = false;
return; //統治するなら何か返す
}
void dfs(ll k,ll par,map<P,ll>&mp,P c){
//cout<<k spa c.fi spa c.se<<endl;
mp[MP(max(c.fi,c.se),min(c.fi,c.se))]++;
if(c.se!=-1){
mp[MP(-1,c.fi)]++;
mp[MP(-1,c.se)]++;
}
else mp[MP(-1,-1)]++;
for(auto e:g[k]){
if(e.to==par||used[e.to])continue;
if(c.fi==e.col||c.se==e.col)dfs(e.to,k,mp,c);
else if(c.se==-1)dfs(e.to,k,mp,MP(c.fi,e.col));
}
}
};
int main(){
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
ll res=0,buf=0;
bool judge = true;
ll n,k;cin>>n>>k;
vector<vector<edge>>g(n);
rep(i,0,n-1){
ll u,v,c;cin>>u>>v>>c;
u--;v--;c--;
g[u].EB(v,c);
g[v].EB(u,c);
}
CentroidDecomposition cent(g);
cent.run();
cout<<cent.answer/2<<endl;
return 0;
}
tute7627