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

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

这种题目我们可以二分答案,考虑怎么\(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. 使用寄存器点亮LED

    1. 项目:使用stm32寄存器点亮LED, 分别点亮红.绿.蓝3个灯. 2. 代码: 只需要编写main.c程序,stm3210x.h程序为空(只需要新建即可). 2.1 点亮绿灯main.c程序 ...

  2. 初学python-day3 列表

  3. F1英国大奖赛-银石赛道地图及弯道

    背景 今天晚上(2020-08-02)是今年英国大奖赛的正赛.刚好了解了一下赛道地图.记录一下,明年就不用到处找了. 简介 银石赛道(Silverstone Circuit)由一个废弃的空军基地改建, ...

  4. CQL和SQL的CRUD操作比较

    数据进行CRUD操作时,CQL语句和SQL语句的异同之处. 1.建表 2.CRUD语句比较 3.总结 1.建表 在此之前先分别创建两张表,插入数据,用来测试然后进行比较 在SQL数据库里面创建表 在C ...

  5. 机器学习:EM算法

    EM算法 各类估计 最大似然估计 Maximum Likelihood Estimation,最大似然估计,即利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值的计算过程. 直白来讲,就 ...

  6. 北航OO第四单元总结

    OO最后一次博客作业--好聚好散 一.单元总结 作业一: 第一次是对类图进行解析,没有太大难度,只要根据讨论区提供的建议,新建两个类来存储相关数据即可实现. 作业二: 第二次作业的难度只有量的提升,然 ...

  7. Noip模拟78 2021.10.16

    这次时间分配还是非常合理的,但可惜的是$T4$没开$\textit{long long}$挂了$20$ 但是$Arbiter$上赏了蒟蒻$20$分,就非常不错~~~ T1 F 直接拿暴力水就可以过,数 ...

  8. AOP源码解析:AspectJExpressionPointcutAdvisor类

    先看看 AspectJExpressionPointcutAdvisor 的类图 再了解一下切点(Pointcut)表达式,它指定触发advice的方法,可以精确到返回参数,参数类型,方法名 1 pa ...

  9. linux tr

    转载:tr命令_Linux tr 命令用法详解:将字符进行替换压缩和删除 (linuxde.net) tr命令 文件过滤分割与合并 tr命令可以对来自标准输入的字符进行替换.压缩和删除.它可以将一组字 ...

  10. F. Mattress Run 题解

    F. Mattress Run 挺好的一道题,对于DP的本质的理解有很大的帮助. 首先要想到的就是将这个拆成两个题,一个dp光求获得足够的夜晚的最小代价,一个dp光求获得足够的停留的最小代价. 显然由 ...