Description

给你一个n个点m个条边构成的简单无向连通图,有Q组询问,每次询问从两个点x,y走出两条路径,使这两条路径覆盖z个点,求得一种方案使得路径上经过的变的最大编号最小。

Input

第一行两个整数n,m,如题目所述

接下来m行,每行两个整数x,y描述一条边

接下来一个整数Q,如题目所述

接下来Q行,每行三个整数x,y,z,如题目描述

Output

Q行,每行一个正整数,如题目描述

题解:

先想一想,可以用并查集解决,但 \(n^2\) 太慢了,于是就想到了整体二分。

我先是用了一个普通的并查集,结果发现每次都要初始化一遍,T 飞了。

后来想着可以支持删除,就不能路径压缩了(还是T飞),我了解到了一个黑科技,按秩合并。

我们合并两棵树的时候,我们把树高小的挂在树高大的下面,这样就能把树高控制在log级别。

然后我们加边的时候,用栈记录合并的两个节点,分完之后,再从栈中一个个地取出来恢复原样就好了。

到最后一个点的时候我们再把这条边连上,成功AC。

对了,我之前加了这个剪枝:

if(x<y)return;

就是说如果区间里没有数就不往下了,但这会导致有些边没有连,就WA了。

CODE:

#include<iostream>
#include<stack>
#include<cstdio>
using namespace std; int n,m,q,ans[100005];
int siz[100005],fa[100005];
struct Edge{
int x,y;
}e[100005];
struct Question{
int x,y,z,id;
}Q[100005],tmp[100005];
stack<Edge> s; int find(int x){
if(x==fa[x])return x;
return find(fa[x]);
} void solve(int l,int r,int x,int y){
if(l==r){
for(int i=x;i<=y;i++)ans[Q[i].id]=l;
int fx=find(e[l].x),fy=find(e[l].y);
if(siz[fx]>siz[fy])swap(fx,fy);
if(fx!=fy)fa[fx]=fy,siz[fy]+=siz[fx];
return;
}
int mid=l+r>>1;
for(int i=l;i<=mid;i++){
int fx=find(e[i].x),fy=find(e[i].y);
if(siz[fx]>siz[fy])swap(fx,fy);
if(fx!=fy){
fa[fx]=fy,siz[fy]+=siz[fx];
s.push((Edge){fx,fy});
}
}
int tot1=x-1,tot2=0;
for(int i=x,size;i<=y;i++){
int fx=find(Q[i].x),fy=find(Q[i].y);
if(fx==fy)size=siz[fx];
else size=siz[fx]+siz[fy];
if(size>=Q[i].z)Q[++tot1]=Q[i];
else tmp[++tot2]=Q[i];
}
for(int i=1;i<=tot2;i++)Q[tot1+i]=tmp[i];
while(!s.empty()){
Edge e=s.top();s.pop();
fa[e.x]=e.x,siz[e.y]-=siz[e.x];
}
solve(l,mid,x,tot1);
solve(mid+1,r,tot1+1,y);
} int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d",&e[i].x,&e[i].y);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=n;i++)siz[i]=1;
scanf("%d",&q);
for(int i=1;i<=q;i++){
scanf("%d%d%d",&Q[i].x,&Q[i].y,&Q[i].z);
Q[i].id=i;
}
solve(1,m,1,q);
for(int i=1;i<=q;i++)
printf("%d\n",ans[i]);
}

最新文章

  1. TFS 2015 敏捷开发实践 – 在Kanban上运行一个Sprint
  2. Mosquitto搭建Android推送服务(三)Mosquitto集群搭建
  3. (翻译)编写属于你的jQuery插件
  4. iOS:命令行方式使用OSChina托管私有代码
  5. Java编程思想重点
  6. python中使用zip函数出现&lt;zip object at 0x02A9E418&gt;
  7. 执行计划之CONCATENATION
  8. codevs 1128 导弹拦截 (贪心)
  9. 使用Android SDK Manager自动下载速度慢解决方法
  10. C#中Linq延迟执行问题
  11. 脚本录制--html模式和url模式
  12. dcoker实战,使用docker部署NodeJs应用
  13. deepin linux学习笔记
  14. 使用k8s operator安装和维护etcd集群
  15. 各类nosql db的功能与性能对比
  16. QInputDialog Multiple Inputs 输入多个变量的对话框
  17. ES6语法 promise用法
  18. C# 添加日志 log4net
  19. javascript数组操作大全,数组方法总汇
  20. 错误处理:WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping

热门文章

  1. SpingBoot之多Profile文件
  2. hprose 1.0(rpc 框架) - 关于跨域和P3P的声明
  3. 科学计算库Numpy——文件读写
  4. [Uva623]500!(高精)
  5. 裸奔着造房子——对政府禁止采购Win8系统的一些看法
  6. Maven使用入门
  7. CMD命令简介
  8. 微服务化的不同阶段 Kubernetes 的不同玩法
  9. http协议学习笔记——状态码
  10. 在数组中寻找出现次数大于N/K的数