結果

問題 No.399 動的な領主
ユーザー TAISA_TAISA_
提出日時 2019-02-23 18:35:58
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 127 ms / 2,000 ms
コード長 2,781 bytes
コンパイル時間 1,808 ms
コンパイル使用メモリ 178,076 KB
実行使用メモリ 16,176 KB
最終ジャッジ日時 2023-08-20 18:41:00
合計ジャッジ時間 5,546 ms
ジャッジサーバーID
(参考情報)
judge14 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,380 KB
testcase_01 AC 1 ms
4,376 KB
testcase_02 AC 1 ms
4,380 KB
testcase_03 AC 1 ms
4,376 KB
testcase_04 AC 2 ms
4,380 KB
testcase_05 AC 10 ms
4,376 KB
testcase_06 AC 127 ms
11,748 KB
testcase_07 AC 125 ms
11,700 KB
testcase_08 AC 126 ms
11,840 KB
testcase_09 AC 125 ms
11,648 KB
testcase_10 AC 3 ms
4,380 KB
testcase_11 AC 10 ms
4,376 KB
testcase_12 AC 112 ms
12,272 KB
testcase_13 AC 111 ms
12,284 KB
testcase_14 AC 99 ms
16,136 KB
testcase_15 AC 101 ms
16,176 KB
testcase_16 AC 110 ms
14,136 KB
testcase_17 AC 127 ms
11,744 KB
testcase_18 AC 126 ms
11,684 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#define all(vec) vec.begin(),vec.end()
#define mp make_pair
using namespace std;
using ll=long long;
using P=pair<ll,ll>;
const ll INF=1LL<<30;
const ll LINF=1LL<<62;
const double eps=1e-9;
const ll MOD=1000000007LL;
template<typename T>void chmin(T &a,T b){a=min(a,b);};
template<typename T>void chmax(T &a,T b){a=max(a,b);};
template<typename T>vector<T> make_v(size_t a){return vector<T>(a);}
template<typename T,typename... Ts>auto make_v(size_t a,Ts... ts){return vector<decltype(make_v<T>(ts...))>(a,make_v<T>(ts...));}
template<typename T,typename V>typename enable_if<is_class<T>::value==0>::type fill_v(T& t,const V& v){t=v;}
template<typename T,typename V>typename enable_if<is_class<T>::value!=0>::type fill_v(T& t,const V& v){for(auto &e:t)fill_v(e,v);};
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
struct HLDecomposition{
    int n,pos;
    vector<vector<int>> G;
    vector<ll> sum;
    vector<int> nid,fst,hv,id,siz,dep,par;
    HLDecomposition(int n_):n(n_),pos(0),G(n),sum(n+10),nid(n,-1),fst(n,-1),hv(n,-1),id(n),siz(n,1),par(n,-1){}
    void add_edge(int u,int v){
        G[u].push_back(v);
        G[v].push_back(u);
    }
    void build(int rt){
        par[rt]=-1;
        dfs(rt);
        bfs(rt);
    }
    void dfs(int v){
        int ma=0;
        for(auto u:G[v]){
            if(u==par[v])continue;
            par[u]=v;
            dfs(u);
            siz[v]+=siz[u];
            if(ma<siz[u]){
                ma=siz[u];
                hv[v]=u;
            }
        }
    }
    void bfs(int rt){
        queue<int> q;
        q.push(rt);
        while(!q.empty()){
            int h=q.front();q.pop();
            for(int i=h;i!=-1;i=hv[i]){
                nid[i]=pos++;
                id[nid[i]]=i;
                fst[i]=h;
                for(auto j:G[i]){
                    if(j!=par[i]&&j!=hv[i]){
                        q.push(j);
                    }
                }
            }
        }
    }
    void query(int u,int v){
        while(1){
            if(nid[u]>nid[v])swap(u,v);
            sum[max(nid[fst[v]],nid[u])]++;
            sum[nid[v]+1]--;
            if(fst[v]!=fst[u]){
                v=par[fst[v]];
            }else{
                break;
            }
        }
    }
    ll ans(){
        for(int i=1;i<=n;i++){
            sum[i]+=sum[i-1];
        }
        ll res=0;
        for(int i=0;i<n;i++){
            res+=(1LL+sum[i])*sum[i]/2;
        }
        return res;
    }
};
int main(){
    int n;cin>>n;
    HLDecomposition tree(n);
    for(int i=0;i<n-1;i++){
        int u,v;cin>>u>>v;--u;--v;
        tree.add_edge(u,v);
    }
    tree.build(0);
    int q;cin>>q;
    while(q--){
        int u,v;cin>>u>>v;--u;--v;
        tree.query(u,v);
    }
    cout<<tree.ans()<<endl;
}
0