http://acm.hdu.edu.cn/showproblem.php?pid=6203

给出q条链 由u和v确定 每条链上至少有一个节点是有故障的 问整个树图中至少有多少故障节点

对于每条链 求出lca 再按lca的深度降序排序

然后对于一条链 如果uv节点都没有被其他链覆盖过 那就将lca对应的整棵子树标记覆盖 答案加加 否则就说明当前这条链上的故障点已经可以和别的链合并了 可以忽略

至于为什么要按深度降序排序 我认为这样每次只需要判断一条链是不是已经通过其他链确定 如果升序排序 每一次要看lca到u和v这条链上有多少其它链上的lca被影响 很难写   (借鉴)同时 由于优先处理 LCA 深度大的点 不会出现点 U V 同时在同一个被禁止通行点 P 的子树内

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;struct node0
{int u;int v;int lca;
};struct node1
{int v;int next;
};node0 pre[50010];
node1 edge[60010];
int dp[30010][15];
int val[120010];
int first[30010],deep[30010],mp[30010],sum[30010];
int n,q,num;bool cmp(node0 n1,node0 n2)
{return deep[n1.lca]>deep[n2.lca];
}void addedge(int u,int v)
{edge[num].v=v;edge[num].next=first[u];first[u]=num++;
}void dfs(int cur,int fa)
{int i,v;mp[cur]=++num,sum[cur]=1;for(i=first[cur];i!=-1;i=edge[i].next){v=edge[i].v;if(v!=fa){dp[v][0]=cur;deep[v]=deep[cur]+1;dfs(v,cur);sum[cur]+=sum[v];}}return;
}void solve()
{int i,j;dp[1][0]=0;deep[1]=1;num=0;dfs(1,0);for(j=1;(1<<j)<=n;j++){for(i=1;i<=n;i++){dp[i][j]=dp[dp[i][j-1]][j-1];}}return;
}int getlca(int u,int v)
{int i;if(deep[u]<deep[v]) swap(u,v);for(i=log2(n);i>=0;i--){if(deep[dp[u][i]]>=deep[v]){u=dp[u][i];}}if(u==v) return u;for(i=log2(n);i>=0;i--){if(dp[u][i]!=dp[v][i]){u=dp[u][i];v=dp[v][i];}}return dp[u][0];
}void query(int tar,int &res,int l,int r,int cur)
{int m;res|=val[cur];if(l==r) return;m=(l+r)/2;if(tar<=m) query(tar,res,l,m,2*cur);else query(tar,res,m+1,r,2*cur+1);
}void update(int pl,int pr,int l,int r,int cur)
{int m;if(pl<=l&&r<=pr){val[cur]=1;return;}m=(l+r)/2;if(pl<=m) update(pl,pr,l,m,2*cur);if(pr>m) update(pl,pr,m+1,r,2*cur+1);
}int main()
{int i,u,v,resu,resv,ans;while(scanf("%d",&n)!=EOF){n++;memset(first,-1,sizeof(first));num=0;for(i=1;i<=n-1;i++){scanf("%d%d",&u,&v);u++,v++;addedge(u,v);addedge(v,u);}solve();scanf("%d",&q);for(i=1;i<=q;i++){scanf("%d%d",&pre[i].u,&pre[i].v);pre[i].u++,pre[i].v++;pre[i].lca=getlca(pre[i].u,pre[i].v);}sort(pre+1,pre+q+1,cmp);for(i=1;i<=4*n;i++) val[i]=0;ans=0;for(i=1;i<=q;i++){resu=0,resv=0;query(mp[pre[i].u],resu,1,n,1);query(mp[pre[i].v],resv,1,n,1);if(!resu&&!resv){update(mp[pre[i].lca],mp[pre[i].lca]+sum[pre[i].lca]-1,1,n,1);ans++;}}printf("%d\n",ans);}return 0;
}

ping ping ping HDU - 6203相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 虚拟机ping网关ping不通

    虚拟机ping网关ping不通,可能自己遇到的比较奇特,开始访问正常,过一段时间就不正常,分享一下解决办法: 首先ping同网段的可以ping的通,说明vmnet8的ipv4不和虚拟机配置的vmnet ...

  7. 全网超详细的如何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 ...

  8. C# ping命令,ping网络状态

    Ping ping = new Ping(); PingReply pingReply = ping.Send("192.168.1.1"); //网络状态 if (pingRep ...

  9. [HDU 6203] ping ping ping

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意:给出一棵树, 给出p组点对(u, v), 求删除最少的点使得这p组点对均不联通.(n≤1 ...

最新文章

  1. 哪个牌子的平板电脑好_中山密码锁哪个牌子好
  2. 《Java疯狂讲义》(第3版)学习笔记 2 - Java语言的运行机制
  3. 深度剖析「圈组」消息系统设计 | 「圈组」技术系列文章
  4. 中高级工程师Java开发!java生成随机数代码包
  5. Initialization failed for ‘https://start.spring.io‘ Please check URL, network and proxy settings.
  6. 非正弦周期电流电路和信号的频谱
  7. java 鼠标拖动_java 让表项支持鼠标拖动移位,并自动滚动滚动条
  8. Axure高保真智慧校园管理系统/校园管理/人事管理/学籍管理/教学管理/流程审批/备课管理/考务管理/成绩管理/排课管理/选课管理/选课系统/调课申请/教师考评管理/web端管理系统
  9. 智慧医疗解决方案可以大大减少医疗资源浪费!
  10. 医学专业失业率最高 三类相关行业人才紧缺
  11. CDOJ 483 Data Structure Problem DFS
  12. css渐变颜色php,css的渐变颜色
  13. HeadFirstJava——7_继承与多态
  14. Python之面向对象-类与 类之间的关系
  15. 作业20171127-4 事后诸葛亮会议
  16. 30行Python代码实现蚂蚁森林自动偷能量
  17. python 对比两张图片是否相同
  18. Linux创建用户和删除用户
  19. 【封面】把握软件产业发展新机遇 ——记第二十届中国国际软件博览会
  20. 群晖NAS用迅雷远程下载Xware 1.xxx的进程监视和掉线自动重启

热门文章

  1. Virtualbox虚拟机设置共享文件夹
  2. 互联网运营面试题_必看❗️面试互联网运营常见问题及答案
  3. 天才女博士事迹引发的感想
  4. dhtml gantt所有配置_甘特图dhtmlxGantt使用教程:如何快速设置内联编辑器和编辑JavaScript Gantt数据...
  5. 蓝牙鼠标windows linux,windows linux双系统共用蓝牙鼠标
  6. 解决连接深信服vp无法通过burpsuit抓包的问题
  7. licode erizo pipleline 1 : handlercontext
  8. netmiko链接思科WLC无线控制器
  9. 信息系统项目管理师必背核心考点(七十二)V模型
  10. matlab测量直流母线上的电压,基于模糊控制的有源滤波器直流母线电压控制