結果
| 問題 | 
                            No.399 動的な領主
                             | 
                    
| コンテスト | |
| ユーザー | 
                             rapurasu
                         | 
                    
| 提出日時 | 2016-07-19 18:02:36 | 
| 言語 | C++11(廃止可能性あり)  (gcc 13.3.0)  | 
                    
| 結果 | 
                             
                                TLE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 1,808 bytes | 
| コンパイル時間 | 1,474 ms | 
| コンパイル使用メモリ | 160,776 KB | 
| 実行使用メモリ | 21,504 KB | 
| 最終ジャッジ日時 | 2024-10-15 17:21:59 | 
| 合計ジャッジ時間 | 7,639 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 14 TLE * 1 -- * 4 | 
ソースコード
 #include<bits/stdc++.h>
 using namespace std;
#define INF 1000000000
#define REP(i,n) for(int (i)=0;(i)<(int)(n);(i)++)
typedef long long int LL;
int parent[100002];
int rnk[100002];
vector<int> v[100002];
int cost[100002];
bool check[100002];
bool check2[100002];
//親の作成
void dfs(int n,int x){
   REP(i,v[n].size()){
       int a=v[n][i];
       if(check[a]==false){
          check[a]=true;
          parent[a]=n;
          rnk[a]=x;
          dfs(a,x+1);
       }
   }
}
//imos法
LL imos(int n){
   LL ans=0;
   REP(i,v[n].size()){
       int a=v[n][i];
       if(check2[a]==false){
          check2[a]=true;
          ans+=imos(a);
          cost[n]+=cost[a];
       }
   }
   LL mm=cost[n];
   ans+=(mm+1)*mm/2;
//cout<<n<<*m<<endl;
   return ans;
}
//最小の親を求める
LL lca(int n,int m){
     if(rnk[n]<rnk[m]){
        int temp=m;
        m=n;
        n=temp;
     }
//cout<<rnk[n]<<rnk[m]<<endl;
     int s=rnk[n]-rnk[m];
//cout<<n<<m<<0<<s<<endl;
     REP(i,s){
         n=parent[n];
     }
//cout<<n<<m<<endl;
     while(1){
         if(n==m)break;
         n=parent[n];
         m=parent[m];
     }
     return n;
}
int main(){
    REP(i,100002){
        parent[i]=0;
        rnk[i]=-1;
        cost[i]=0;
        check[i]=false;
        check2[i]=false;
    }
    int N,Q;
    cin>>N;
    REP(i,N-1){
        int a,b;
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    check[1]=true;
    rnk[1]=0;
    dfs(1,1);
    cin>>Q;
    REP(i,Q){
        int a,b;
        cin>>a>>b;
        cost[a]++;
        cost[b]++;
        if(lca(a,b)!=-1){
           cost[lca(a,b)]--;
           if(parent[lca(a,b)]!=-1){
              cost[parent[lca(a,b)]]--;
           }
        }
    }
    check2[1]=true;
    LL ans=imos(1);
    cout<<ans<<endl;
}
            
            
            
        
            
rapurasu