結果
問題 | No.399 動的な領主 |
ユーザー | tempura_pp |
提出日時 | 2018-08-13 23:30:02 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 252 ms / 2,000 ms |
コード長 | 2,225 bytes |
コンパイル時間 | 1,303 ms |
コンパイル使用メモリ | 105,336 KB |
実行使用メモリ | 26,696 KB |
最終ジャッジ日時 | 2024-09-24 08:24:19 |
合計ジャッジ時間 | 4,932 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 3 ms
6,816 KB |
testcase_01 | AC | 3 ms
6,944 KB |
testcase_02 | AC | 3 ms
6,940 KB |
testcase_03 | AC | 4 ms
6,940 KB |
testcase_04 | AC | 4 ms
6,944 KB |
testcase_05 | AC | 19 ms
7,296 KB |
testcase_06 | AC | 252 ms
22,092 KB |
testcase_07 | AC | 251 ms
22,100 KB |
testcase_08 | AC | 242 ms
22,168 KB |
testcase_09 | AC | 240 ms
22,340 KB |
testcase_10 | AC | 5 ms
6,940 KB |
testcase_11 | AC | 18 ms
7,424 KB |
testcase_12 | AC | 186 ms
23,224 KB |
testcase_13 | AC | 185 ms
23,116 KB |
testcase_14 | AC | 148 ms
26,696 KB |
testcase_15 | AC | 159 ms
26,696 KB |
testcase_16 | AC | 170 ms
24,008 KB |
testcase_17 | AC | 238 ms
22,216 KB |
testcase_18 | AC | 241 ms
22,276 KB |
ソースコード
#include<iostream> #include<string> #include<algorithm> #include<vector> #include<iomanip> #include<math.h> #include<complex> #include<queue> #include<deque> #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 LCA{ int n,h; vector<vector<int>> v,par; vector<int> depth; LCA(int sz):n(sz),v(n),depth(n){ h=1; while((1<<h)<n)h++; par.assign(h,vector<int>(n,-1)); } void add_edge(int x,int y){ v[x].push_back(y); v[y].push_back(x); } void dfs(int x,int p,int d){ par[0][x]=p; depth[x]=d; for(auto to:v[x])if(to!=p)dfs(to,x,d+1); } void build(){ dfs(0,-1,0); rep(i,h-1){ rep(j,n){ if(par[i][j]<0)par[i+1][j]=-1; else par[i+1][j]=par[i][par[i][j]]; } } } int lca(int u,int v){ if(depth[u]>depth[v])swap(u,v); rep(i,h)if((depth[v]-depth[u])>>i &1)v=par[i][v]; if(u==v)return u; for(int i=h-1;i>=0;i--){ if(par[i][u]!=par[i][v]){ u=par[i][u]; v=par[i][v]; } } return par[0][u]; } int dist(int u,int v){ return depth[u]+depth[v]-2*depth[lca(u,v)]; } }; vector<int> v[101010]; ll a[101010]; void dfs(int x,int p){ for(auto to:v[x]){ if(to==p)continue; dfs(to,x); } if(p!=-1)a[p]+=a[x]; } int main(){ int n; cin>>n; LCA lca(n); rep(i,n-1){ int x,y; cin>>x>>y; --x;--y; v[x].push_back(y); v[y].push_back(x); lca.add_edge(x, y); } lca.build(); int q; cin>>q; rep(i,q){ int x,y; cin>>x>>y; --x;--y; int z=lca.lca(x, y); int zz=lca.par[0][z]; ++a[x]; ++a[y]; --a[zz]; --a[z]; } dfs(0,-1); ll ans=0; rep(i,n)ans+=a[i]*(a[i]+1)/2; cout<<ans<<endl; return 0; }