传送门


先求dfs序in[]和out[],以及lca
将不能连通的(u,v)按lca深度从大到小排序
树状数组维护数组flag[]
flag[ini]=0:i点与任意{v|flag[inv]=0}连通flag[in_i]=0 : i点与任意\{v|flag[in_v]=0\}连通
flag[ini]>0:i点与任意{v|flag[inv]=0}不连通flag[in_i]>0 : i点与任意\{v|flag[in_v]=0\}不连通
依次处理每对(u,v)
若flag[inu]>0||flag[inv]>0,则u,v已经不连通,跳过若flag[in_u]>0||flag[in_v]>0,则u,v已经不连通,跳过
否则,将lcau,v视为坏点,将flag[inlca...outlca]全都+1否则,将lca_{u,v}视为坏点,将flag[in_{lca}...out_{lca}]全都+1


因为当前取出的(u,v),lcau,v深度比之前的都小,所以要么flag[inu]=flag[inv]=0,要么一个=0,一个>0因为当前取出的(u,v),lca_{u,v}深度比之前的都小,所以要么flag[in_u]=flag[in_v]=0,要么一个=0,一个>0
而以后取出的(u′,v′),其中一点的深度必然>=lcau,v深度,所以(u′,v′)的位置只能有3种情况而以后取出的(u',v'),其中一点的深度必然>=lca_{u,v}深度,所以(u',v')的位置只能有3种情况
①:2点都在lcau,v为根的子树内,且lcau′,v′=lcau,v(flag>0)①:2点都在lca_{u,v}为根的子树内,且lca_{u',v'}=lca_{u,v} (flag>0)
②:一点在lcau,v为根的子树内(flag>0),一点不在(flag=0)②:一点在lca_{u,v}为根的子树内(flag>0),一点不在(flag=0)
③:2点都不在lcau,v为根的子树内(flag=0)③:2点都不在lca_{u,v}为根的子树内(flag=0)
所以当u点被确定为坏点,u为根的子树内的点,与之后查询的点都不连通,flag[inu]>0所以当u点被确定为坏点,u为根的子树内的点,与之后查询的点都不连通,flag[in_u]>0

#include<stdio.h>
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define MEM(a,x) memset(a,x,sizeof(a))
#define lowbit(x) ((x)&-(x))using namespace std;const int inf=1e9+7;
const int INF = inf;const int N = 1e4 + 5;//顶点数
const int M = 50000 + 5;//查询数struct Query{int u,v,lca;
};
vector<int>G[N];//fist:to  second:w边权
vector<pii>queryTo[N];//first:to second:这个查询在query[M]中的下标
Query query[M];
int par[N];//并查集
bool visited[N];//Tarjan标记是否被访问过
inline int find(int x){return x==par[x]?x:par[x]=find(par[x]);
}void Tarjan(int u){visited[u]=true;for(int i=0;i<G[u].size();++i){int to=G[u][i];if(visited[to]==false){Tarjan(to);par[to]=u;}}for(int i=0;i<queryTo[u].size();++i){int v=queryTo[u][i].first;int index=queryTo[u][i].second;if(visited[v])query[index].lca=find(v);}
}void init(int n){fill(visited,visited+n+1,0);for(int i=0;i<=n;++i){par[i]=i;}
}int in[N],out[N],depth[N];
void dfs(int u,int &t,int fa,int d){in[u]=++t;depth[u]=d;for(int v:G[u]){if(v!=fa){dfs(v,t,u,d+1);}}out[u]=t;
}struct Bit{int c[N],n;void init(int n){this->n=n+1;fill(c,c+n+2,0);}void add(int x,int val){//a[x]...a[n] 全部+valx+=1;while(x<=n){c[x]+=val;x+=lowbit(x);}}ll sum(int x){//a[x]ll ans=0;x+=1;while(x){ans+=c[x];x-=lowbit(x);}return ans;}
}bit;bool operator>(const Query&a,const Query&b){return depth[a.lca]>depth[b.lca];
}int slove(int n,int q){init(n);{int t=-1;dfs(0,t,-1,0);}bit.init(n);Tarjan(0);sort(query,query+q,greater<Query>());int ans=0;for(int i=0;i<q;++i){Query&t=query[i];if(bit.sum(in[t.u])||bit.sum(in[t.v])){continue;}++ans;int st=in[t.lca],ed=out[t.lca];bit.add(st,1);bit.add(ed+1,-1);}return ans;
}int main(){//freopen("/home/lu/code/r.txt","r",stdin);//freopen("/home/lu/code/w.txt","w",stdout);int n;while(~scanf("%d",&n)){for(int i=0;i<=n;++i){G[i].clear();queryTo[i].clear();}for(int i=1;i<=n;++i){int u,v;scanf("%d%d",&u,&v);G[u].push_back(v);G[v].push_back(u);}int p;scanf("%d",&p);for(int i=0;i<p;++i){int u,v;scanf("%d%d",&u,&v);query[i]={u,v,-1};queryTo[u].push_back({v,i});queryTo[v].push_back({u,i});}printf("%d\n",slove(n,p));}return 0;
}

HDU6203 ping ping ping 【LCA+BIT】相关推荐

  1. 防火墙已经关闭,自己能ping通别人,别人ping不通自己。且自己ping自己显示【一般故障】

    防火墙已经关闭,自己能ping通别人,别人ping不通自己.且自己ping自己显示[一般故障].如下图: 这是因为使用了VPN导致的,这种软件是把双刃剑,即方便自己,又恶心的要死,让人既想干ta又不想 ...

  2. keepalived vip ping不通_【干货分享】OpenStack LVS负载均衡为什么不通?

    背 景 介 绍 OpenStack环境Neutron 的安全组会向虚拟机默认添加 anti-spoof 的规则,将保证虚拟机只能发出/接收以本机Port为原地址或目的地址(IP.MAC)的流量,提高了 ...

  3. SEO工具百度泛目录ping批量提交【带拨号】

    介绍: 这类工具本站已经发过好几款了,大家根据需求自行选择测试,原理是很简单,就是POST链接到百度ping的接口. 百度泛目录多线程ping工具(ping泛目录批量提交助手)是一款非常优秀好用的百度 ...

  4. 【洛谷】【lca+结论】P3398 仓鼠找sugar

    [题目描述:] 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室 ...

  5. HDU 5266 pog loves szh III【LCA RMQ】

    B - pog loves szh III 题目:添加链接描述 题意:找出区域l到r的LCA->找l和r的LCA 分析: 链式前向星存树,先用dfs处理结点倍增关系. 然后从循环处理较深结点,直 ...

  6. php fping,【Linux 命令】fping ping 包间隔时间详解

    服务器间检查会用到fping的命令,期间遇到了一个问题,需要将ping包间的间隔时间设置为100毫秒,查看fping -h看下,找到了-i和-p两个参数: 看到这两个参数,我当时的表情是这样的: 看不 ...

  7. 【重难点】【计算机网络 01】OSI 七层模型和 TCP/IP 四层模型、IP 地址分为哪几类、ping 的原理、从浏览器地址栏输入 URL 到显示网页的过程、什么是 socket

    [重难点][计算机网络 01]OSI 七层模型和 TCP/IP 四层模型.IP 地址分为哪几类.ping 的原理.从浏览器地址栏输入 URL 到显示网页的过程.什么是 socket 文章目录 [重难点 ...

  8. 计算机网络ping作用是什么,ping是什么意思?ping测试网络的步骤【详解】

    计算机对于我们来说,是既熟悉又陌生的.为什么这样说呢?熟悉是因为它几乎存在于我们每个人的生活中,几乎每个人都会用到计算机,我们也喜欢用计算机工作.娱乐以及交流等等.而陌生的是,计算机的功能太多,它是一 ...

  9. 【安全测试】DOS攻击:ping攻击

    一.Ping攻击介绍 Ping攻击就是不断向指定的IP地址发送不接收回复的数据包,目标主机都需要耗费一定的系统资源进行应答回复,这种攻击通过发送大于65536字节的ICMP包使操作系统崩溃. 通常不可 ...

最新文章

  1. java basedaoimpl_java web项目DAO层通用接口BaseDao与实现类BaseDaoImpl
  2. 简单tarjan》一道裸题(BZOJ1051)(easy)
  3. java折半查找(正常的折半查找)
  4. Spring之SpringMVC(四)
  5. 春节期间,我用责任链模式重构了业务代码
  6. 关注细节但不陷入细节
  7. zend studio设置自动保存
  8. 手把手图文并茂教你发布Android开源库
  9. 分享帝国CMS采集教程(图文详解)
  10. java 导出word简历_java导出生成word(类似简历导出)
  11. Import REC修复的时候找不到被调试程序进程
  12. 线性方程组(四)- 矩阵方程
  13. 从古代遗传下来的设计值得一看!
  14. 互联网创业如何起步(二)
  15. Hash索引和BTree索引区别
  16. AHCI VS IDE 把我整疯了。。。
  17. 【总结】自己不知道的知识
  18. android textview 楷体,Android自定义控件之自定义Text,画出米字格-FenGKun
  19. 腾讯云接口调用签名鉴权
  20. Android图片海报制作软件开发实践

热门文章

  1. Windows Server 2003 sp1升级到sp2报错解决办法
  2. 听说你还在用dp做屏幕适配?
  3. 网页一屏到底有多大 1024*768 800*600 网页设计大小 网页设计尺寸
  4. 决战燕京城-09 白狗大战蟒蛇
  5. 实验二 :熟悉双绞线水晶头的制作
  6. 大数据云计算——2020大数据云计算岗面经面试问题和经验一
  7. 小马哥----高仿小米4 tc01刷机拆机主板图与开机界面图 分联通版与移动版
  8. 在线客服 生成 代码
  9. c.k是四分之一混血吗
  10. InstallShield安装与制作