[AGC002D] Stamp Rally
确实有想到重构树,不过没有继续下去的思路。
可能是对重构树的性质不太懂。
这种题目我们可以二分答案,考虑怎么\(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的更多相关文章
- 【做题】agc002D - Stamp Rally——整体二分的技巧
题意:给出一个无向连通图,有\(n\)个顶点,\(m\)条边.有\(q\)次询问,每次给出\(x,y,z\),最小化从\(x\)和\(y\)开始,总计访问\(z\)个顶点(一个顶点只计算一次),经过的 ...
- [AGC002D] Stamp Rally 整体二分+并查集
Description 给你一个n个点m个条边构成的简单无向连通图,有Q组询问,每次询问从两个点x,y走出两条路径,使这两条路径覆盖z个点,求得一种方案使得路径上经过的变的最大编号最小. Input ...
- [AGC002D] Stamp Rally (并查集+整体二分)
Description 给你一个n个点m个条边构成的简单无向连通图,有Q组询问,每次询问从两个点x,y走出两条路径,使这两条路径覆盖z个点,求得一种方案使得路径上经过的变的最大编号最小. Input ...
- 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 ...
- Stamp Rally
Stamp Rally 最大值最小,可以二分,然后并查集看能不能到z个点 但是询问过多,并且发现每次二分要加入的点并不是所有的m条边 于是就考虑整体二分 并查集的处理是重点: 对于一般的dfs分治树, ...
- 【agc002d】Stamp Rally
题目大意 无向图中,每次询问从x和y分别出发,一共经过z个点,使需要走过编号最大的边最小. 解题思路 对于暴力,我们对于每个询问二分答案ans,将1~ans的边加入,用并查集维护,如果x和y在同一个并 ...
- [agc002D]Stamp Rally-[并查集+整体二分]
Description 题目大意:给你一个n个点m个条边构成的简单无向连通图,有Q组询问,每次询问从两个点x,y走出两条路径,使这两条路径覆盖z个点,求得一种方案使得路径上经过的边的最大编号最小.n, ...
- Kruskal 重构树小记
其实也不是多难的知识点吧--学了一个中午+半个下午就把它学会了(做过那道 jxd 作业 CF571D 的应该比较好理解) Kruskal 重构树大概就是在正常 Kruskal 的时候,对于两个需要连边 ...
- AtCoder Grand Contest 002
AtCoder Grand Contest 002 A - Range Product 翻译 告诉你\(a,b\),求\(\prod_{i=a}^b i\)是正数还是负数还是零. 题解 什么鬼玩意. ...
随机推荐
- Redis使用过程中有哪些注意事项?看看BAT这类的公司是正确使用Redis的!!
Redis使用过程中要注意的事项 Redis使用起来很简单,但是在实际应用过程中,一定会碰到一些比较麻烦的问题,常见的问题有 redis和数据库数据的一致性 缓存雪崩 缓存穿透 热点数据发现 下面逐一 ...
- SpringCloud微服务实战——搭建企业级开发框架(五):数据库持久化集成MySql+Druid+MyBatis-Plus
在引入相关数据库持久化相关依赖库之前,我们可以考虑到,当我们因业务开发需要,引入各种各样的依赖库时,Jar包冲突是我们必须面对的一个问题,Spring为了解决这些Jar包的冲突,推出了各种bom, ...
- Linux搭建SVN服务器详细教程
前言 本文讲解Linux系统下如何搭建SVN服务器,详细说明各配置项的功能,最终实现可管控多个项目的复杂配置. SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统 ...
- 写了10000条Airtest截图脚本总结出来的截图经验,赶紧收藏!
前言 今天想先给大家分享1个小白用户的Airtest从入门到放弃的故事: 小A是一个自动化的小白,在逛测试论坛的时候,偶然间发现了Airtest这个基于图像识别的UI自动化框架. 出于好奇,小A试用了 ...
- 2021.9.9考试总结[NOIP模拟50]
T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...
- PriorityQueue(优先队列)
PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆顶为最小值. PriorityQueue 一个基于优先级的无界优先级队列. ...
- k8s入坑之路(9)k8s网络插件详解
Flannel: 最成熟.最简单的选择 Calico: 性能好.灵活性最强,目前的企业级主流 Canal: 将Flannel提供的网络层与Calico的网络策略功能集成在一起. Weave: 独有的功 ...
- Java try catch语句块中try()的括号中代码作用
了解过Mybatis,都知道DefacltSqlSession是线程不安全的.每次执行查询都需要新建一个sqlSession.因此官方给的建议写法如下: Mybatis3 从 SqlSessionFa ...
- 这一次,Google 终于对 Web 自动化下手了!
大家好,我是安果! 最近 Google 对 Chrome 进行了一次比较大的更新,其中一项是脚本录制回放功能,它可以非常方便我们处理一些自动化场景 我们可以在 Chrome 官网下载 Chrome C ...
- 大爽Python入门教程 3-2 条件判断: if...elif..else
大爽Python入门公开课教案 点击查看教程总目录 简单回顾if 回顾下第一章的代码 >>> x = 5 >>> if x > 0: ... print(&q ...