Description

给出一棵n+1n+1n+1个节点的树,要求破坏尽可能少的点使得所给mmm对点对均不可互达

Input

第一行一整数n" role="presentation" style="position: relative;">nnn,之后nnn行每行两个整数u,v" role="presentation" style="position: relative;">u,vu,vu,v表示一条树边,然后输入一整数mmm,最后m" role="presentation" style="position: relative;">mmm行每行两个整数u,vu,vu,v表示需要使得u,vu,vu,v不可互达(3≤n≤104,1≤p≤5⋅104)(3≤n≤104,1≤p≤5⋅104)(3\le n\le 10^4,1\le p\le 5\cdot 10^4)

Output

输出需要删去的最少点数

Sample Input

4
1 0
4 2
2 0
3 2
2
1 3
2 1

Sample Output

1

Solution

为使被删掉的点尽可能起作用,对于一个点对要删去影响最大的点,即其LCALCALCA,对每个点对求出其LCALCALCA,把查询按点对LCALCALCA深度降序排,先处理LCALCALCA深度最深的点对,因为先处理其他点对不能解决该点对的问题,但是先解决该点对的问题可以顺带就解决了其他点对的问题,删去LCALCALCA后,为了保留下删除该点的影响,把以该点为根的子树全部标记加一,这样以来,对于后面的点对u,vu,vu,v,如果uuu或v" role="presentation" style="position: relative;">vvv的标记非零,说明uuu或v" role="presentation" style="position: relative;">vvv的某个祖先被删掉了,且这个被删掉的祖先深度比u,vu,vu,v的LCALCALCA深度深,也即当前点对不需要删点已经被解决掉了,对子树的更新操作求出dfsdfsdfs序后用树状数组维护即可

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
#define maxn 10005
#define maxm 50005
int n,m,p[maxn][15],dep[maxn],index,L[maxn],R[maxn];
vector<int>g[maxn];
void dfs(int u,int fa)
{p[u][0]=fa;for(int i=1;i<15;i++)p[u][i]=p[p[u][i-1]][i-1];L[u]=++index;for(int i=0;i<g[u].size();i++){int v=g[u][i];if(v==fa)continue;dep[v]=dep[u]+1;dfs(v,u);}R[u]=index;
}
int lca(int a,int b)
{int i,j;if(dep[a]<dep[b])swap(a,b);for(i=0;(1<<i)<=dep[a];i++);i--;for(j=i;j>=0;j--)if(dep[a]-(1<<j)>=dep[b])a=p[a][j];if(a==b) return a;for(j=i;j>=0;j--)if(p[a][j]&&p[a][j]!=p[b][j])a=p[a][j],b=p[b][j];return p[a][0];
}
struct BIT
{#define lowbit(x) (x&(-x))int b[maxn],n;void init(int _n){n=_n;for(int i=1;i<=n;i++)b[i]=0;}void update(int x,int v){while(x<=n){b[x]+=v;x+=lowbit(x);}}int query(int x){int ans=0;while(x){ans+=b[x];x-=lowbit(x);}return ans;}
}bit;
struct node
{int u,v,t;bool operator<(const node&b)const{return dep[t]>dep[b.t];}
}a[maxm];
int main()
{while(~scanf("%d",&n)){n++;bit.init(n);for(int i=1;i<=n;i++)g[i].clear();memset(p,0,sizeof(p));for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);u++,v++;g[u].push_back(v),g[v].push_back(u);}index=0;dep[1]=0;dfs(1,0);scanf("%d",&m);for(int i=0;i<m;i++){scanf("%d%d",&a[i].u,&a[i].v);a[i].u++,a[i].v++;a[i].t=lca(a[i].u,a[i].v);}sort(a,a+m);int ans=0;for(int i=0;i<m;i++){int u=a[i].u,v=a[i].v,t=a[i].t;int temp=bit.query(L[u])+bit.query(L[v]);if(!temp){ans++;bit.update(L[t],1),bit.update(R[t]+1,-1);}}printf("%d\n",ans);}return 0;
}

HDU 6203 ping ping ping(在线倍增LCA+BIT)相关推荐

  1. HDU 6203 ping ping ping (在线倍增lca+DFS序+树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 #include<bits/stdc++.h> using namespace st ...

  2. HDU 5266 pog loves szh III(在线倍增LCA+ST)

    Description 给出一棵有n个节点的树,定义1为树根,有q次询问,每次询问区间[a,b]中所有节点的LCA Input 第一行为一整数n表示节点数,之后n-1行每行两个整数a和b表示树的一条边 ...

  3. 四叠半神话大系(bfs序+st+在线倍增+二分)(北理16校赛)

    时间限制1秒 内存限制64M 题目描述: 「我们大部分的烦恼,是来自于梦想另一种有可能的人生.把希望寄托于自己的可能性这种不能指望的东西,正是万恶的根源.」 时间突然停止. 我获得了可以在平行世界中穿 ...

  4. HDU 6203 ping ping ping lca 线段树成段更新

    题目链接:HDU 6203 ping ping ping Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  5. hdu 6203 ping ping ping(贪心+树状数组+dfs序)

    题目链接:hdu 6203 ping ping ping 题意: 给你一棵n+1个节点树,现在有q条路径不通,问你最少有多少个节点坏掉了. 题解: 考虑贪心,对这q条路径求一下lca,按照lca的深度 ...

  6. 全网超详细的如何Ping特定的端口号,比如telnet Ping,nc Ping,nmap Ping等

    文章目录 1. 文章引言 2. ping特定端口 2.1 使用telnet ping特定端口 2.2 使用nc ping特定端口 2.3 使用nmap ping端口 2.4 使用Powershell ...

  7. linux命令菜鸟ping,Linux ping命令

    Linux ping命令 Linux ping命令用于检测主机. 执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常. 语 ...

  8. 复制vmware overLay网络无法ping通 ping www.baidu.com可以

    因为忘记关闭防火墙了!!!!!    要永久关闭!! 修改hostname https://blog.csdn.net/qq_27327261/article/details/109100219 关闭 ...

  9. linux使用ping命令ping本机,Linux下使用ping命令判断网络的好坏

    简介 在Linux系统里面如果想判断网络的好坏,脑海中蹦出的第一个命令就是ping了. ping命令基本是最常用的网络命令,它可以用来测试与目标主机的连通性. ping通过发送ICMP ECHO_RE ...

最新文章

  1. 单文档程序创建的时候,标题栏的无标题怎么可以去掉,并且改成自己想要的字符...
  2. 数据库类型少_全栈之数据库系列 - 数据库的设计、架构和使用规范
  3. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | Class.cpp#findClassNoInit 函数 | DexFile.cpp#dexFindClass 函数分析 )
  4. 跟燕十八学习PHP-第十九天-热身项目完善
  5. 高通平台smd分析及smem共享内存的创建笔记
  6. Android怎么结束一个进程,我试了用 ActivityManager.killBackgroundProcesses方法去结束,但是没有反应
  7. solidity struct 结构体创建与使用浅学 (四)
  8. linux 源码 目录,Linux系统主要目录及kernel源代码目录
  9. C#LeetCode刷题之#628-三个数的最大乘积( Maximum Product of Three Numbers)
  10. href up test.php,test.php
  11. 接口自动化测试框架必备的9个功能举例
  12. 详细介绍ASP.NET状态保存方法
  13. 柳婼、知乎PAT经验分享汇总
  14. 有趣好玩的python编程网站
  15. 3.究竟什么是“财富自由”?
  16. linux相关操作命令(*)
  17. stanford coreNLP简单使用
  18. 近期工作心得(总结篇)
  19. 【论文精读】Deep Rectangling for Image Stitching: A Learning Baseline
  20. .NetCore Mediator的简单使用

热门文章

  1. AutoCAD 2009建筑设计实战从入门到精通视频教程
  2. iPhone App创建与审核步骤二:如何在developer.apple.com网站中设置App预览和截屏以完成App上架
  3. 隐马尔科夫模型c#语言算法实现,HMM学习最佳范例四:隐马尔科夫模型
  4. Cadence SPB 16. 6 安装步骤
  5. android 动态设置控件的大小
  6. 艾孜尔江_Office操作部分题库大全【干货】
  7. html字体荧光效果,CSS3字体发光效果
  8. python对excel数据统计_python读取excel数据做分类统计
  9. 3.02 使用bison在语法分析中构建抽象语法树AST
  10. 适用于任意模糊内核的深度即插即用超分辨率(DPSR论文笔记-2019CVPR)