Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using ll = long long;
- vector<vector<int>>g;
- const int N=1e5;
- const int mxe=22;
- int up[N][mxe];
- vector<int>par,dep,diff;
- vector<ll>ans;
- void dfs(int vert,int p=0,int d=0){
- par[vert]=p;
- dep[vert]=d;
- for(auto&child:g[vert]){
- if(child!=p){
- dfs(child,vert,d+1);
- }
- }
- }
- int lift(int vert,int dist){
- int node=vert;
- for(int i=mxe-1;i>=0;i--){
- if(node!=0){
- if(dist&(1<<i)){
- node=up[node][i];
- }
- }
- }
- return node;
- }
- int lca(int u,int v){
- u=lift(u,dep[u]-min(dep[u],dep[v]));
- v=lift(v,dep[v]-min(dep[u],dep[v]));
- if(u==v)return u;
- for(int i=mxe-1;i>=0;i--){
- if(up[u][i]!=up[v][i]){
- u=up[u][i];
- v=up[v][i];
- }
- }
- return up[u][0];
- }
- ll dfs1(int vert,int p){
- ll sum=1ll*diff[vert];
- for(auto&child:g[vert]){
- if(child!=p){
- sum+=dfs1(child,vert);;
- }
- }
- return ans[vert]=sum;
- }
- void solve(){
- int n,k;cin>>n>>k;
- par.resize(n+1,0);
- dep.resize(n+1,0);
- diff.resize(n+2,0);
- ans.resize(n+1,0);
- g.resize(n+1,vector<int>());
- for(int i=0;i<n-1;i++){
- int u,v;cin>>u>>v;
- g[u].push_back(v);
- g[v].push_back(u);
- }
- memset(up,0,sizeof(up));
- dfs(1,0,0);
- for(int i=1;i<=n;i++){
- up[i][0]=par[i];
- }
- for(int i=1;i<mxe;i++){
- for(int j=1;j<=n;j++){
- if(up[j][i-1]!=0){
- up[j][i]=up[up[j][i-1]][i-1];
- }
- }
- }
- for(int i=0;i<k;i++){
- int u,v;cin>>u>>v;
- int l=lca(u,v);
- // cout<<l+1<<endl;
- diff[u]++;diff[v]++;diff[l]--;diff[par[l]]--;
- }
- dfs1(1,0);
- ll res=0;
- for(int i=1;i<=n;i++){
- res=max(ans[i],res);
- }
- cout<<res;
- }
- int main() {
- // freopen("haybales.in","r",stdin);
- // freopen("haybales.out","w",stdout);
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- int t=1;
- // cin>>t;
- while(t--){
- solve();
- }
- return 0;
- }
- // for(int l=1;l<me;l++){
- // for(int i=0;i<n;i++){
- // if(up[i][l-1]!=-1)up[i][l]=up[up[i][l-1]][l-1];
- // }
- // }
- /*
- lift code:
- int lift(int node,int distance){
- for(int e=0;e<maxe;e++){
- if(node!=-1){
- if(distance&(1<<e)){
- node=up[node][e];
- }
- }
- }
- return node;
- }
- */
- //
Advertisement
Add Comment
Please, Sign In to add comment