結果
| 問題 |
No.399 動的な領主
|
| コンテスト | |
| ユーザー |
TAISA_
|
| 提出日時 | 2019-02-23 18:35:58 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 175 ms / 2,000 ms |
| コード長 | 2,781 bytes |
| コンパイル時間 | 2,033 ms |
| コンパイル使用メモリ | 179,036 KB |
| 実行使用メモリ | 16,640 KB |
| 最終ジャッジ日時 | 2024-11-30 22:34:20 |
| 合計ジャッジ時間 | 5,716 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 19 |
ソースコード
#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;
}
TAISA_