确实有想到重构树,不过没有继续下去的思路。

可能是对重构树的性质不太懂。

这种题目我们可以二分答案,考虑怎么\(check\)呢,整体二分+并查集,建出重构树,找去第一个小于这个数的方点,查询他的子树大小。

不过因为是两个点,要注意两点的满足性质的方点是同一个点的情况。

[AGC002D] Stamp Rally
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define N 200005 struct P{int to,s;ll v;}e[N]; inline bool operator < (P a,P b){return a.v < b.v;} ll n,m; ll tot; ll fa[N]; inline ll find(int x){return (fa[x] == x) ? x : fa[x] = find(fa[x]);} ll v[N << 1],head[N << 1],cnt; struct E{int to,next;}p[N << 2]; inline void add(int x,int y){
p[++cnt].to = y;
p[cnt].next = head[x];
head[x] = cnt;
} inline void build(){
ll cnt = 0;
tot = n;
for(int i = 1;i <= m,cnt < n - 1;++i){
int x = e[i].s,y = e[i].to;
int fx = find(x),fy = find(y);
if(fx == fy)
continue;
++tot;
add(tot,fx);
add(tot,fy);
v[tot] = e[i].v;
fa[tot] = fa[fx] = fa[fy] = tot;
++cnt;
}
} ll f[N << 1][30],siz[N << 1],dep[N << 1]; inline void dfs(int x,int fi){
f[x][0] = fi;
dep[x] = dep[fi] + 1;
if(x <= n)
siz[x] = 1;
for(int i = 1;i <= 24;++i)
f[x][i] = f[f[x][i - 1]][i - 1];
for(int i = head[x];i;i = p[i].next){
int v = p[i].to;
dfs(v,x);
siz[x] += siz[v];
}
} inline ll find_rt(int u,int x){
for(int i = 24;i >= 0;--i){
if(v[f[u][i]] <= x)
u = f[u][i];
}
return u;
} ll q; int main(){
scanf("%lld%lld",&n,&m);
for(int i = 1;i <= m;++i){
scanf("%d%d",&e[i].s,&e[i].to);
e[i].v = i;
}
for(int i = 1;i <= n;++i)
fa[i] = i;
std::sort(e + 1,e + m + 1);
build();
// puts("");
dfs(find(1),0);
v[0] = 0x3f3f3f3f;
scanf("%lld",&q);
for(int i = 1;i <= q;++i){
ll x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
ll l = 1,r = m,ans = 0;
bool flag = 0;
while(l <= r){
ll mid = (l + r) >> 1;
ll fx = find_rt(x,mid),fy = find_rt(y,mid);
// std::cout<<mid<<" "<<fx<<" "<<fy<<std::endl;
if(fx == fy)
flag = (siz[fx] >= z);
else
flag = (siz[fx] + siz[fy] >= z);
if(flag)
ans = mid,r = mid - 1;
else
l = mid + 1;
}
std::cout<<ans<<std::endl;
}
}

[AGC002D] Stamp Rally的更多相关文章

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

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

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

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

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

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

  4. AtCoder Grand Contest 002 D - Stamp Rally

    Description We have an undirected graph with N vertices and M edges. The vertices are numbered 1 thr ...

  5. Stamp Rally

    Stamp Rally 最大值最小,可以二分,然后并查集看能不能到z个点 但是询问过多,并且发现每次二分要加入的点并不是所有的m条边 于是就考虑整体二分 并查集的处理是重点: 对于一般的dfs分治树, ...

  6. 【agc002d】Stamp Rally

    题目大意 无向图中,每次询问从x和y分别出发,一共经过z个点,使需要走过编号最大的边最小. 解题思路 对于暴力,我们对于每个询问二分答案ans,将1~ans的边加入,用并查集维护,如果x和y在同一个并 ...

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

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

  8. Kruskal 重构树小记

    其实也不是多难的知识点吧--学了一个中午+半个下午就把它学会了(做过那道 jxd 作业 CF571D 的应该比较好理解) Kruskal 重构树大概就是在正常 Kruskal 的时候,对于两个需要连边 ...

  9. AtCoder Grand Contest 002

    AtCoder Grand Contest 002 A - Range Product 翻译 告诉你\(a,b\),求\(\prod_{i=a}^b i\)是正数还是负数还是零. 题解 什么鬼玩意. ...

随机推荐

  1. 7-Zip

    7-Zip https://www.7-zip.org/

  2. Java:并发笔记-01

    Java:并发笔记-01 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 1. 进程与线程 本章内容 进程和线程的概念 并行和并发的概念 线程基本应用 1.1 ...

  3. 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(二)

    一.基于邻接表的Dijkstra算法 如前一篇文章所述,在 Dijkstra 的算法中,维护了两组,一组包含已经包含在最短路径树中的顶点列表,另一组包含尚未包含的顶点.使用邻接表表示,可以使用 BFS ...

  4. SkyWalking配上告警更优秀

    前言 对于监控系统来说,不可能让人一直盯着监控看板,而更多的是以自动提醒的方式,比如邮件.短信或微信推送等,当达到或超出预设的告警指标时,就自动发送消息提醒,下面就来说说如何配置SkyWalking的 ...

  5. Linkerd 2:5 分种厘清 Service Mesh 相关术语

    API Gateway(API 网关) API gateway 位于应用程序的前面,旨在解决身份验证和授权.速率限制以及为外部消费者提供公共访问点等业务问题. 相比之下,service mesh 专注 ...

  6. 基于live555开发嵌入式linux系统的rtsp直播服务

    最近要搞一个直播服务,车机本身是个前后双路的Dvr,前路1080P 25fps,后路720P 50fps,现在要连接手机app预览实时画面,且支持前后摄像头画面切换. 如果要做直播,这个分辨率和帧率是 ...

  7. cf 11A Increasing Sequence(水,)

    题意: A sequence a0, a1, ..., at - 1 is called increasing if ai - 1 < ai for each i: 0 < i <  ...

  8. Python——Excel转Json工具

    Python工具Excel转Json 前置条件 1.安装python 下载python 我下载的是2.7: 2.配置环境变量 我的电脑右键--属性--高级系统设置--环境变量: 添加python的安装 ...

  9. shell 中单引号和双引号的区别

    用以下代码来说明: #!/bin/bash url="http://c.biancheng.net" website1='C语言中文网:${url}' website2=" ...

  10. Centos7上安装Ubuntu容器

    1.再次之前我们要先装好docker,在上一篇我已经给出了教程,没有安装好的快去看看吧! 2.这里我们使用的是linux系统,所有在线安装是最简便的方法了.我们可以从国内拉取dockerhub镜像,这 ...