思路参考:http://blog.csdn.net/DorMOUSENone/article/details/77929604

题意:

n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V 无法连通。问无法通行的点最少有多少个。

思路:

思路同参考博客。本人手拙,用线段树维护的LCA询问,代码更长一些。

看到这题想到的是LCA+树链剖分,原理相同,排序LCA后,查询链上是否有坏点,但实现起来实在麻烦。同样是对于祖先信息的维护和查询,DFS序就简单许多。

代码:

#include <bits/stdc++.h>
using namespace std;
#define ls l,mid,rt*2
#define rs mid+1,r,rt*2+1
#define mi (l+r)/2
const int MAXN=1e4+7;
const int INF=0x3f3f3f3f;
typedef struct Node{int x,y,lca;bool operator < (const Node &a)const{return lca>a.lca;}
}Node;
Node nodes[MAXN*5];
int anspos,n,m,in[MAXN],out[MAXN],order[2*MAXN],depth[MAXN],cnt,tree[MAXN*8],minn,st,en;
bool lazy[MAXN*4];
vector<int> edge[MAXN];void ini(){depth[0]=0;cnt=0;for(int i=0;i<=n;i++) edge[i].clear();
}
void dfs1(int pos,int fa){int len=edge[pos].size();order[++cnt]=pos;in[pos]=cnt;for(int i=0;i<len;i++){if(edge[pos][i]!=fa){depth[edge[pos][i]]=depth[pos]+1;dfs1(edge[pos][i],pos);order[++cnt]=pos;}}return ;
}
void dfs2(int pos,int fa){int len=edge[pos].size();in[pos]=++cnt;for(int i=0;i<len;i++){if(edge[pos][i]!=fa){dfs2(edge[pos][i],pos);}}out[pos]=cnt;
}
void push_down2(int rt){if(lazy[rt]) lazy[rt*2]=lazy[rt*2+1]=1;
}
void push_up1(int rt){tree[rt]=min(tree[rt*2],tree[rt*2+1]);
}
void build1(int l,int r,int rt){if(l==r){tree[rt]=depth[order[l]];return ;}int mid=mi;build1(ls);build1(rs);push_up1(rt);
}
void build2(int l,int r,int rt){lazy[rt]=0;if(l==r){return ;}int mid=mi;build2(ls);build2(rs);
}
void update2(int l,int r,int rt){if(l>en||r<st) return ;if(st<=l&&r<=en){lazy[rt]=1;return ;}int mid=mi;update2(ls);update2(rs);// push_up2(rt);
}
void query1(int l,int r,int rt){if(l>en||r<st) return ;if(st<=l&&r<=en){if(tree[rt]>minn) return ;minn=tree[rt];}if(l==r){anspos=l;return ;}int mid=mi;query1(ls);query1(rs);
}
bool query2(int l,int r,int rt){if(l>en||r<st) return 0;if(lazy[rt]) return 1;if(l==r) return 0;push_down2(rt);int mid=mi;return query2(ls)||query2(rs);
}
int main(){while(scanf("%d",&n)!=-1){ini();for(int i=1;i<=n;i++){int x,y;scanf("%d%d",&x,&y);edge[x].push_back(y);edge[y].push_back(x);}dfs1(0,-1);build1(1,cnt,1);scanf("%d",&m);for(int i=0;i<m;i++){int x,y;scanf("%d%d",&x,&y);st=in[x];en=in[y];minn=INF;if(st>en) swap(st,en);query1(1,cnt,1);nodes[i]={x,y,order[anspos]};}sort(nodes,nodes+m);int ans=0;cnt=0;dfs2(0,-1);build2(1,cnt,1);for(int i=0;i<m;i++){st=en=in[nodes[i].x];if(!query2(1,cnt,1)){st=en=in[nodes[i].y];if(!query2(1,cnt,1)){ans++;st=in[nodes[i].lca];en=out[nodes[i].lca];update2(1,cnt,1);}}}cout<<ans<<endl;}
}

HDU 6203 ping ping ping (LCA+DFS序)相关推荐

  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 - 6203 ping ping ping(LCA+dfs序+线段树)

    题目链接:点击查看 题目大意:给出一棵由n+1个节点组成的数,节点编号为0~n(这个无关紧要,预处理时所有节点以及n都自增1即可转换为正常的模型了),现在给出m组节点u和v,问若想让m组u和v都断开连 ...

  3. HDU 6203 贪心 + LCA + dfs序 + BIT

    简要题意:给出一个n+1n+1个点的树,以及若干个点对,需要断开一些点,使得这些点对路径不连通.输出应该断开的最少点数. 我们断开一个点,能够影响到的是: 1.1.子树中过这个点的路径. 2.2.一个 ...

  4. A and B and Lecture Rooms CodeForces - 519E LCA+dfs序

    看到这个题的第一个思路就是就是统计以每一个点为根的所有节点个数,然后具体就分情况讨论一下即可. 因为刚刚学习了dfs序,这个题就用了dfs序来通过进出时间戳来相减表示其为根的子节点个数. 分情况 我们 ...

  5. POJ - 2763 Housewife Wind LCA+dfs序+线段树

    q次询问求两个点之间的距离,并且可以随时修改某条边的长度,最短距离可以用lca来求,但是树上维护每一个点到root的距离必须要用dfs序来记录时间戳,在dfs的时候顺便记录每一条边(u,v)对应的v节 ...

  6. codeforces E. Jamie and Tree LCA+dfs序+线段树

    题解: 写起来还稍微有点麻烦. dfs序+线段树可以维护子树的整体修改和查询. 因此,这道题我们要往子树上靠. 我们首先从1号点进行dfs遍历,顺便求出点的dfs序和深度,然后我们采用倍增的思想,可以 ...

  7. nowcoder172C 保护 (倍增lca+dfs序+主席树)

    https://www.nowcoder.com/acm/contest/172/C (sbw大佬太强啦 orz) 先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对 ...

  8. [BZOJ4719][P1600][NOIP2016]天天爱跑步[LCA+dfs序+差分]

    题意:一棵树,有 \(m\) 个人从 \(s_i\) 到 \(t_i\) 跑步,每个人的速度都是1,每个点有一个观察员 当一个人在w[i]经过第 \(i\) 个点的时候 第 \(i\) 个点的答案+1 ...

  9. Codeforces Gym 101142 G Gangsters in Central City (lca+dfs序+树状数组+set)

    题意: 树的根节点为水源,编号为 1 .给定编号为 2, 3, 4, -, n 的点的父节点.已知只有叶子节点都是房子. 有 q 个操作,每个操作可以是下列两者之一: + v ,表示编号为 v 的房子 ...

最新文章

  1. 硬盘温度70度正常吗_70多岁老年人原来血压160,现在130正常吗?医生为你分析实情...
  2. Hello world!
  3. 核心机房电源中断应急预案
  4. springmvc常用注解与类型转换
  5. TR069 ACS模拟器测试脚本
  6. 5步详解PHP文件上传功能的实现
  7. 设置Activity进入退出动画
  8. CRC 冗余校验计算
  9. idea2016 android genyomtion,Android Studio Genyomtion配置
  10. Android文件的保存(本地和SD卡)与读取
  11. WINDOWS XP 桌面主题的安装制作
  12. ICP备案线下注销 网站域名备案注销
  13. 磁流体和两相磁流体的无条件能量稳定解耦算法
  14. 自己画一块ESP32-C3 的开发板(立创EDA)(PCB到手)
  15. `英语` 2022/8/23
  16. 今天零晨的大雨好厉害呀
  17. 告诉你Windows PE 是什么东东?详细介绍一下winpe
  18. 安卓 类微信界面开发(一)
  19. 国产高性能车载应用DCDC电源芯片SCT2432、SCT2432Q
  20. Python深度学习与机器视觉(一)

热门文章

  1. 如何用python写小工具_用python写一个录音小工具
  2. 基于PHP+mysql的社区人口管理系统的设计与实现
  3. 本科广东省计算机学校排名,中山大学南方学院排名2021 广东排名第6全国排名第13...
  4. PTA 循环结构 7-1 求cosx的近似值
  5. android studio安卓手机tcp通信打开app自动连接,连接失败自动重试8次
  6. 图像分类中的SVM多核学习
  7. 英语——动名词(一)
  8. 8.Java基础之多线程
  9. 安兔兔html5测试苹果,iPhone6 plus安兔兔跑分图 性能测试
  10. 怎样在html里插入ppt,在PPT中插入的视频如何设置播放和停止呢?