結果

問題 No.399 動的な領主
ユーザー rapurasurapurasu
提出日時 2016-07-19 17:54:16
言語 C++11
(gcc 11.4.0)
結果
RE  
実行時間 -
コード長 1,905 bytes
コンパイル時間 1,490 ms
コンパイル使用メモリ 160,996 KB
実行使用メモリ 21,504 KB
最終ジャッジ日時 2024-04-23 16:50:21
合計ジャッジ時間 9,658 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 RE -
testcase_01 RE -
testcase_02 RE -
testcase_03 RE -
testcase_04 RE -
testcase_05 RE -
testcase_06 RE -
testcase_07 RE -
testcase_08 RE -
testcase_09 RE -
testcase_10 RE -
testcase_11 RE -
testcase_12 RE -
testcase_13 RE -
testcase_14 TLE -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:111:16: warning: ‘m’ is used uninitialized [-Wuninitialized]
  111 |     LL ans=imos(1,m);
      |            ~~~~^~~~~

ソースコード

diff #

 #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 *m){
   LL ans=0;
   LL sum=0;
   LL pre=*m;
   REP(i,v[n].size()){
       int a=v[n][i];
       if(check2[a]==false){
          check2[a]=true;
          ans+=imos(a,m);
          sum+=*m-pre;
          *m=pre;
       }
   }
   *m=*m+sum;
   LL mm=*m;
   mm+=cost[n];
   ans+=(mm+1)*mm/2;
   *m=mm;
//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 *m;
    LL ans=imos(1,m);
    cout<<ans<<endl;

}
0