HDU6203 ping ping ping 【LCA+BIT】
传送门
先求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】相关推荐
- 防火墙已经关闭,自己能ping通别人,别人ping不通自己。且自己ping自己显示【一般故障】
防火墙已经关闭,自己能ping通别人,别人ping不通自己.且自己ping自己显示[一般故障].如下图: 这是因为使用了VPN导致的,这种软件是把双刃剑,即方便自己,又恶心的要死,让人既想干ta又不想 ...
- keepalived vip ping不通_【干货分享】OpenStack LVS负载均衡为什么不通?
背 景 介 绍 OpenStack环境Neutron 的安全组会向虚拟机默认添加 anti-spoof 的规则,将保证虚拟机只能发出/接收以本机Port为原地址或目的地址(IP.MAC)的流量,提高了 ...
- SEO工具百度泛目录ping批量提交【带拨号】
介绍: 这类工具本站已经发过好几款了,大家根据需求自行选择测试,原理是很简单,就是POST链接到百度ping的接口. 百度泛目录多线程ping工具(ping泛目录批量提交助手)是一款非常优秀好用的百度 ...
- 【洛谷】【lca+结论】P3398 仓鼠找sugar
[题目描述:] 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室 ...
- HDU 5266 pog loves szh III【LCA RMQ】
B - pog loves szh III 题目:添加链接描述 题意:找出区域l到r的LCA->找l和r的LCA 分析: 链式前向星存树,先用dfs处理结点倍增关系. 然后从循环处理较深结点,直 ...
- php fping,【Linux 命令】fping ping 包间隔时间详解
服务器间检查会用到fping的命令,期间遇到了一个问题,需要将ping包间的间隔时间设置为100毫秒,查看fping -h看下,找到了-i和-p两个参数: 看到这两个参数,我当时的表情是这样的: 看不 ...
- 【重难点】【计算机网络 01】OSI 七层模型和 TCP/IP 四层模型、IP 地址分为哪几类、ping 的原理、从浏览器地址栏输入 URL 到显示网页的过程、什么是 socket
[重难点][计算机网络 01]OSI 七层模型和 TCP/IP 四层模型.IP 地址分为哪几类.ping 的原理.从浏览器地址栏输入 URL 到显示网页的过程.什么是 socket 文章目录 [重难点 ...
- 计算机网络ping作用是什么,ping是什么意思?ping测试网络的步骤【详解】
计算机对于我们来说,是既熟悉又陌生的.为什么这样说呢?熟悉是因为它几乎存在于我们每个人的生活中,几乎每个人都会用到计算机,我们也喜欢用计算机工作.娱乐以及交流等等.而陌生的是,计算机的功能太多,它是一 ...
- 【安全测试】DOS攻击:ping攻击
一.Ping攻击介绍 Ping攻击就是不断向指定的IP地址发送不接收回复的数据包,目标主机都需要耗费一定的系统资源进行应答回复,这种攻击通过发送大于65536字节的ICMP包使操作系统崩溃. 通常不可 ...
最新文章
- java basedaoimpl_java web项目DAO层通用接口BaseDao与实现类BaseDaoImpl
- 简单tarjan》一道裸题(BZOJ1051)(easy)
- java折半查找(正常的折半查找)
- Spring之SpringMVC(四)
- 春节期间,我用责任链模式重构了业务代码
- 关注细节但不陷入细节
- zend studio设置自动保存
- 手把手图文并茂教你发布Android开源库
- 分享帝国CMS采集教程(图文详解)
- java 导出word简历_java导出生成word(类似简历导出)
- Import REC修复的时候找不到被调试程序进程
- 线性方程组(四)- 矩阵方程
- 从古代遗传下来的设计值得一看!
- 互联网创业如何起步(二)
- Hash索引和BTree索引区别
- AHCI VS IDE 把我整疯了。。。
- 【总结】自己不知道的知识
- android textview 楷体,Android自定义控件之自定义Text,画出米字格-FenGKun
- 腾讯云接口调用签名鉴权
- Android图片海报制作软件开发实践