HDU 6203 ping ping ping(在线倍增LCA+BIT)
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)相关推荐
- HDU 6203 ping ping ping (在线倍增lca+DFS序+树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 #include<bits/stdc++.h> using namespace st ...
- HDU 5266 pog loves szh III(在线倍增LCA+ST)
Description 给出一棵有n个节点的树,定义1为树根,有q次询问,每次询问区间[a,b]中所有节点的LCA Input 第一行为一整数n表示节点数,之后n-1行每行两个整数a和b表示树的一条边 ...
- 四叠半神话大系(bfs序+st+在线倍增+二分)(北理16校赛)
时间限制1秒 内存限制64M 题目描述: 「我们大部分的烦恼,是来自于梦想另一种有可能的人生.把希望寄托于自己的可能性这种不能指望的东西,正是万恶的根源.」 时间突然停止. 我获得了可以在平行世界中穿 ...
- HDU 6203 ping ping ping lca 线段树成段更新
题目链接:HDU 6203 ping ping ping Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- hdu 6203 ping ping ping(贪心+树状数组+dfs序)
题目链接:hdu 6203 ping ping ping 题意: 给你一棵n+1个节点树,现在有q条路径不通,问你最少有多少个节点坏掉了. 题解: 考虑贪心,对这q条路径求一下lca,按照lca的深度 ...
- 全网超详细的如何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 ...
- linux命令菜鸟ping,Linux ping命令
Linux ping命令 Linux ping命令用于检测主机. 执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常. 语 ...
- 复制vmware overLay网络无法ping通 ping www.baidu.com可以
因为忘记关闭防火墙了!!!!! 要永久关闭!! 修改hostname https://blog.csdn.net/qq_27327261/article/details/109100219 关闭 ...
- linux使用ping命令ping本机,Linux下使用ping命令判断网络的好坏
简介 在Linux系统里面如果想判断网络的好坏,脑海中蹦出的第一个命令就是ping了. ping命令基本是最常用的网络命令,它可以用来测试与目标主机的连通性. ping通过发送ICMP ECHO_RE ...
最新文章
- 单文档程序创建的时候,标题栏的无标题怎么可以去掉,并且改成自己想要的字符...
- 数据库类型少_全栈之数据库系列 - 数据库的设计、架构和使用规范
- 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | Class.cpp#findClassNoInit 函数 | DexFile.cpp#dexFindClass 函数分析 )
- 跟燕十八学习PHP-第十九天-热身项目完善
- 高通平台smd分析及smem共享内存的创建笔记
- Android怎么结束一个进程,我试了用 ActivityManager.killBackgroundProcesses方法去结束,但是没有反应
- solidity struct 结构体创建与使用浅学 (四)
- linux 源码 目录,Linux系统主要目录及kernel源代码目录
- C#LeetCode刷题之#628-三个数的最大乘积( Maximum Product of Three Numbers)
- href up test.php,test.php
- 接口自动化测试框架必备的9个功能举例
- 详细介绍ASP.NET状态保存方法
- 柳婼、知乎PAT经验分享汇总
- 有趣好玩的python编程网站
- 3.究竟什么是“财富自由”?
- linux相关操作命令(*)
- stanford coreNLP简单使用
- 近期工作心得(总结篇)
- 【论文精读】Deep Rectangling for Image Stitching: A Learning Baseline
- .NetCore Mediator的简单使用
热门文章
- AutoCAD 2009建筑设计实战从入门到精通视频教程
- iPhone App创建与审核步骤二:如何在developer.apple.com网站中设置App预览和截屏以完成App上架
- 隐马尔科夫模型c#语言算法实现,HMM学习最佳范例四:隐马尔科夫模型
- Cadence SPB 16. 6 安装步骤
- android 动态设置控件的大小
- 艾孜尔江_Office操作部分题库大全【干货】
- html字体荧光效果,CSS3字体发光效果
- python对excel数据统计_python读取excel数据做分类统计
- 3.02 使用bison在语法分析中构建抽象语法树AST
- 适用于任意模糊内核的深度即插即用超分辨率(DPSR论文笔记-2019CVPR)