結果

問題 No.399 動的な領主
ユーザー tempura_pptempura_pp
提出日時 2018-08-14 00:55:38
言語 C++11
(gcc 11.4.0)
結果
TLE  
実行時間 -
コード長 3,608 bytes
コンパイル時間 1,123 ms
コンパイル使用メモリ 99,000 KB
実行使用メモリ 19,484 KB
最終ジャッジ日時 2024-09-24 08:28:05
合計ジャッジ時間 5,919 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
13,752 KB
testcase_01 AC 3 ms
6,940 KB
testcase_02 AC 2 ms
6,944 KB
testcase_03 AC 2 ms
6,944 KB
testcase_04 AC 3 ms
6,940 KB
testcase_05 AC 12 ms
6,940 KB
testcase_06 AC 151 ms
12,800 KB
testcase_07 AC 147 ms
12,672 KB
testcase_08 AC 153 ms
12,800 KB
testcase_09 AC 154 ms
12,800 KB
testcase_10 AC 4 ms
6,940 KB
testcase_11 AC 11 ms
6,940 KB
testcase_12 AC 108 ms
13,292 KB
testcase_13 AC 105 ms
13,312 KB
testcase_14 AC 60 ms
12,756 KB
testcase_15 AC 62 ms
12,672 KB
testcase_16 TLE -
testcase_17 -- -
testcase_18 -- -
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:155:13: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  155 |        scanf("%d%d",&x,&y);
      |        ~~~~~^~~~~~~~~~~~~~
main.cpp:162:13: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  162 |        scanf("%d%d",&x,&y);
      |        ~~~~~^~~~~~~~~~~~~~

ソースコード

diff #

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<iomanip>
#include<math.h>
#include<complex>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#include<bitset>
using namespace std;
#define REP(i,m,n) for(int i=(int)m ; i < (int) n ; ++i )
#define rep(i,n) REP(i,0,n)
typedef long long ll;
typedef pair<int,int> pint;
typedef pair<ll,int> pli;
const int inf=1e9+7;
const ll longinf=1LL<<60 ;
const ll mod=1e9+7 ;
int dx[4]={1,0,-1,0} , dy[4]={0,1,0,-1} ;


struct BIT{
private:
   int sz;
   vector<ll> node;
public:
   BIT(int n):sz(n),node(n+1){};
   void add(int k,ll x){
       k++;
       while(k<=sz){
           node[k]+=x;
           k+=k&-k;
       }
   }
   ll sum(int k){
       k++;
       ll ret=0;
       while(k>0){
           ret+=node[k];
           k-=k&-k;
       }
       return ret;
   }
   ll sum(int l,int r){
       return sum(r-1)-sum(l-1);
   }
   ll get(int k){
       return sum(k,k+1);
   }
};

BIT bit(101010);
struct HLDecomposition{
    int n,pos;
    vector<vector<int>> v;
    vector<int> idx,head,sz,hvy,par,depth,inv,type;

    HLDecomposition(){};
    HLDecomposition(int s):
        n(s),pos(0),v(n),idx(n,-1),head(n),sz(n,1),
        hvy(n,-1),par(n),depth(n),inv(n),type(n){}
    
    void addedge(int x,int y){
        v[x].push_back(y);
        v[y].push_back(x);
    }

    void dfs(int rt){
        stack<int> st;
        par[rt]=-1;
        depth[rt]=0;
        st.push(rt);
        while(!st.empty()){
            int x=st.top();
            st.pop();
            for(int to:v[x]){
                if(to==par[x])continue;
                par[to]=x;
                depth[to]=depth[x]+1;
                st.push(to);
            }
        }
        rep(x,n){
            for(int to:v[x]){
                int res=0;
                if(to==par[x])continue;
                sz[x]+=sz[to];
                if(res<sz[to])res=sz[to],hvy[x]=to;
            }
        }
    }

    void bfs(int r,int c){
        int& k=pos;
        queue<int> q;
        q.push(r);
        while(!q.empty()){
            int h=q.front();q.pop();
            for(int x=h;x!=-1;x=hvy[x]){
                type[x]=c;
                head[x]=h;
                idx[x]=k++;
                inv[idx[x]]=x;
                for(int to:v[x])
                    if(to!=par[x]&&to!=hvy[x])q.push(to);
            }
        }
    }

    void build(vector<int> rs=vector<int>(1,0)){
        int c=0;
        for(int r:rs){
            dfs(r);
            bfs(r,c++);
        }
    }
    void f(int x,int y){
        //ここに何か書く!!!
        bit.add(x,1);
        bit.add(y+1,-1);
    }

    void for_v(int x,int y){
        while(1){
            if(idx[x]>idx[y])swap(x,y);
            f(max(idx[head[y]],idx[x]),idx[y]);
            if(head[x]!=head[y])y=par[head[y]];
            else break;
        }
    }

    void for_edge(int x,int y){
        while(1){
            if(idx[x]>idx[y])swap(x,y);
            if(head[x]!=head[y]){
                f(idx[head[y]],idx[y]);
                y=par[head[y]];
            }
            else{
                if(x!=y)f(idx[x]+1,idx[y]);
                break;
            }
        }
    }
};
int main(){
   int n;cin>>n;
   HLDecomposition hl(n);
   rep(i,n-1){
       int x,y;
       scanf("%d%d",&x,&y);
       hl.addedge(x-1, y-1);
   }
   hl.build();
   int q;cin>>q;
   rep(i,q){
       int x,y;
       scanf("%d%d",&x,&y);
       hl.for_v(x-1,y-1);
   }
   ll ans=0;
   rep(i,n){
       ll ret=bit.sum(i);
       ans+=ret*(ret+1)/2;
   }
   cout<<ans<<endl;
   return 0;
}
0