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

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

这种题目我们可以二分答案,考虑怎么\(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. 好程序员打造核心教培天团,着力培养IT高级研发人才

    随着数字化进程加快,各行各业数字化转型迫在眉睫,技术人才战略成为企业发力重点,IT高级研发人才已经成为企业的"核心资产",对企业发展起关键性作用,然而市场上高级研发人才极为稀缺.据 ...

  2. JBOSS未授权访问漏洞利用

    1. 环境搭建 https://www.cnblogs.com/chengNo1/p/14297387.html 搭建好vulhub平台后 进入对应漏洞目录 cd vulhub/jboss/CVE-2 ...

  3. 使用nexus搭建一个docker私服

    使用nexus搭建docker私服 一.需求: 二.实现步骤 1.编写`docker-compose`文件,实现`nexus`的部署 2.修改/usr/lib/systemd/system/docke ...

  4. 面试官:能用JS写一个发布订阅模式吗?

    目录 1 场景引入 2 代码优化 2.1 解决增加粉丝问题 2.2 解决添加作品问题 3 观察者模式 4 经纪人登场 5 发布订阅模式 6 观察者模式和发布订阅模式的对比 什么是发布订阅模式?能手写实 ...

  5. N 种仅仅使用 HTML/CSS 实现各类进度条的方式

    本文将介绍如何使用 HTML/CSS 创建各种基础进度条及花式进度条及其动画的方式,通过本文,你可能可以学会: 通过 HTML 标签 <meter> 创建进度条 通过 HTML 标签 &l ...

  6. CSS学习(二)选择符

    元素选择符:以元素名作为选择符(span{ color: red; }) 群组选择符:将两个选择符用逗号隔开构成群组(span, div{ color: red; }) 通用选择符:通用选择符(*)将 ...

  7. 痞子衡嵌入式:聊聊i.MXRT1xxx上的普通GPIO与高速GPIO差异及其用法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT上的普通GPIO与高速GPIO差异. GPIO 可以说是 MCU 上最简单最常用的外设模块了,当一些原生功能外设接口模块不能 ...

  8. robot_framewok自动化测试--(3)测试项目与测试套件的概念

    测试项目与测试套件的概念 如果你查看当前所创建的项目会发现,"test_project"是一个目录: "test_suit"则是一个 txt 文件: " ...

  9. Cookie、Session、localStorage、sessionStorage区别和用法

    Cookie 在学习一个新知识点前,我们应该明白自己的学习目标,要带着疑问去学习,该小节须要了解 Cookies 什么是cookie,cookie的作用 cookie的工作机制,即cookie是运作流 ...

  10. Oracle 表空间和权限

    表空间 表空间是数据库的逻辑划分,一个表空间只能属于一个数据库.所有的数据库对象都存放在指定的表空间中.但主要存放的是表,所以称作表空间. Oracle中很多优化都是基于表空间的设计理念而实现的,一个 ...