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]);
}

[AGC002D] Stamp Rally (并查集+整体二分)的更多相关文章

  1. [agc002D]Stamp Rally-[并查集+整体二分]

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

  2. [AGC002D] Stamp Rally

    确实有想到重构树,不过没有继续下去的思路. 可能是对重构树的性质不太懂. 这种题目我们可以二分答案,考虑怎么\(check\)呢,整体二分+并查集,建出重构树,找去第一个小于这个数的方点,查询他的子树 ...

  3. [AGC002D] Stamp Rally 整体二分+并查集

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

  4. 【做题】agc002D - Stamp Rally——整体二分的技巧

    题意:给出一个无向连通图,有\(n\)个顶点,\(m\)条边.有\(q\)次询问,每次给出\(x,y,z\),最小化从\(x\)和\(y\)开始,总计访问\(z\)个顶点(一个顶点只计算一次),经过的 ...

  5. NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...

  6. POJ3228 并查集或二分最大流枚举答案

    忘记写题意了.这题题意:给出每个地点的金矿与金库的数量,再给出边的长度.求取最大可通过边长的最小权值使每个金矿都能运输到金库里. 这题和之前做的两道二分枚举最大流答案的问法很相识,但是这里用最大流速度 ...

  7. 【2018百度之星初赛 B】1001并查集 1004二分 1006不等式

    1001 degree 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6380 并查集向图中加点,分别记录与初始度数最多的点 直接相连的点数.独立的点数 ...

  8. HDU-3081-Marriage Match II 二分图匹配+并查集 OR 二分+最大流

    二分+最大流: 1 //题目大意:有编号为1~n的女生和1~n的男生配对 2 // 3 //首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 4 // 5 //然后输入f组,c,d表示 ...

  9. NOIP 2010 关押罪犯 并查集 二分+二分图染色

    题目描述: S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值" ...

随机推荐

  1. Sass和gulp的简单了解

        一.sass  less    css预处理器        sass里面有2种语法  第一种语法是sass  后缀名必须是sass   第二种语法是scss  后缀名必须是scss      ...

  2. SummerVocation_Leaning--java动态绑定(多态)

    概念: 动态绑定:在执行期间(非编译期间)判断所引用的对象的实际类型,根据实际类型调用其相应的方法.如下例程序中,根据person对象的成员变量pet所引用的不同的实际类型调用相应的方法. 具体实现好 ...

  3. PAT 乙级 1003

    题目 题目地址:PAT 乙级 1003 题解 规律观察题,本题的关键在于把题读懂,同时还有几个比较容易疏忽的地方需要注意:总之这道题要考虑的东西更多,细节上也要特别注意: 规律:“如果 aPbTc 是 ...

  4. pycharm clion rider 注册

    JetBrains 公司出品的pycharm clion rider 专业版本都需要注册才能运行,这里有个免费注册方法: JetBrains授权服务器2017.10.7授权方法:激活时选择Licens ...

  5. DevOps - 部署系统 - Cobbler

    Cobbler简介 Cobbler由python语言开发,是对PXE和Kickstart以及DHCP的封装.融合很多特性,提供了CLI和Web的管理形式.更加方便的实行网络安装.适用场景:需要大批量的 ...

  6. 16.VUE学习之-v-show的使用与v-if的差异对比

    v-show的使用与v-if的差异对比 相同点: 都可以达到隐藏和显示的效果. 不同点: v-show 会用display:none 来隐藏元素节点,推荐使用这种方式 v-if 会移除节点,可以配合v ...

  7. 常用模块之 re shutil configparser hashlib xldt和xlwd

    shutil 高级文件处理模块 封装的更简单了 主要是文件的复制,移动,压缩解压缩 需要保证目标文件已经存在shutil.copymode('test.txt','testcopy4.txt') 压缩 ...

  8. openstack源

    为了红帽系在云计算的市场份额,CentOS推出了官方openstack软件源. http://mirrors.ustc.edu.cn/centos/6/cloud/x86_64/openstack-j ...

  9. Leetcode 96. 不同的二叉搜索树

    题目链接 https://leetcode.com/problems/unique-binary-search-trees/description/ 题目描述 给定一个整数 n,求以 1 ... n ...

  10. POJ 2763 Housewife Wind 树链拋分

    一.前言 这破题WA了一天,最后重构还是WA,最后通过POJ讨论版得到的数据显示,我看上去是把某个变量写错了..于是,还是低级错误背锅啊....代码能力有待进一步提升2333333 二.题意 某家庭主 ...