Description

We have an undirected graph with N vertices and M edges. The vertices are numbered 1 through N, and the edges are numbered 1 through M. Edge i connects vertices ai and bi. The graph is connected.

On this graph, Q pairs of brothers are participating in an activity called Stamp Rally. The Stamp Rally for the i-th pair will be as follows:

One brother starts from vertex xi, and the other starts from vertex yi.

The two explore the graph along the edges to visit zi vertices in total, including the starting vertices. Here, a vertex is counted only once, even if it is visited multiple times, or visited by both brothers.

The score is defined as the largest index of the edges traversed by either of them. Their objective is to minimize this value.

Find the minimum possible score for each pair.

Solution

这题一个直接的思路就是二分答案,加边之后判连通块大小

由于有 \(Q\) 组询问,考虑整体二分

注意到这一题中不仅 \([L,mid]\) 之间的边有贡献, \([1,mid]\) 之间的边也有贡献

如果 \(dfs\) 处理的话,复杂度就不对了

考虑 \(bfs\) 序整体二分:

我们每一次都需要把 \([1,mid]\) 之间的边加入,而对于整体二分中同层的节点,\(mid\) 是单调的

所以维护一个单调指针对于每一层扫一遍即可,每当进入新的层之后我们就把指针变成 \(0\),并清空并查集

因为只有 \(log\) 层,所以只会清空 \(log\) 次,所以总复杂度就是 \(O(n*logn)\)

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n,m,Q,fa[N],sz[N],ans[N];
struct node{int x,y,z,id;}e[N];
struct sub{int l,r;vector<node>S;};
queue<sub>q;
inline void Clear(){for(int i=1;i<=n;i++)fa[i]=i,sz[i]=1;}
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline void merge(int x,int y){
if(find(x)==find(y))return ;
x=find(x);y=find(y);
fa[y]=x;sz[x]+=sz[y];
}
inline int getval(int x,int y){
x=find(x);y=find(y);
int ret=sz[x]+sz[y];
if(x==y)ret>>=1;
return ret;
}
void solve(){
int p=0;
while(!q.empty()){
sub s=q.front(),L,R;q.pop();
if(s.l==s.r){
for(int i=s.S.size()-1;i>=0;i--)ans[s.S[i].id]=s.l;
continue;
}
int mid=(s.l+s.r)>>1;
if(p>mid)p=0,Clear();
while(p<mid)p++,merge(e[p].x,e[p].y);
for(int i=s.S.size()-1;i>=0;i--){
node t=s.S[i];
if(getval(t.x,t.y)<t.z)R.S.push_back(t);
else L.S.push_back(t);
}
L.l=s.l;L.r=mid;R.l=mid+1;R.r=s.r;
q.push(L);q.push(R);
}
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
scanf("%d%d",&n,&m);
sub s;node t;
for(int i=1;i<=m;i++)scanf("%d%d",&e[i].x,&e[i].y);
scanf("%d",&Q);
for(int i=1;i<=Q;i++){
scanf("%d%d%d",&t.x,&t.y,&t.z);
t.id=i;s.S.push_back(t);
}
s.l=1;s.r=m;q.push(s);Clear();
solve();
for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);
return 0;
}

AtCoder Grand Contest 002 D - Stamp Rally的更多相关文章

  1. AtCoder Grand Contest 002

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

  2. AtCoder Grand Contest 002 F:Leftmost Ball

    题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...

  3. Atcoder Grand Contest 002 F - Leftmost Ball(dp)

    Atcoder 题面传送门 & 洛谷题面传送门 这道 Cu 的 AGC F 竟然被我自己想出来了!!!((( 首先考虑什么样的序列会被统计入答案.稍微手玩几组数据即可发现,一个颜色序列 \(c ...

  4. AtCoder Grand Contest 002 (AGC002) F - Leftmost Ball 动态规划 排列组合

    原文链接https://www.cnblogs.com/zhouzhendong/p/AGC002F.html 题目传送门 - AGC002F 题意 给定 $n,k$ ,表示有 $n\times k$ ...

  5. 【想法题】Knot Puzzle @AtCoder Grand Contest 002 C/upcexam5583

    时间限制: 2 Sec 内存限制: 256 MB 题目描述 We have N pieces of ropes, numbered 1 through N. The length of piece i ...

  6. [Atcoder Grand Contest 002] Tutorial

    Link: AGC002 传送门 A: …… #include <bits/stdc++.h> using namespace std; int a,b; int main() { sca ...

  7. AtCoder Grand Contest 002题解

    传送门 \(A\) 咕咕 int main(){ cin>>a>>b; if(b<0)puts(((b-a+1)&1)?"Negative": ...

  8. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  9. AtCoder Grand Contest 011

    AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...

随机推荐

  1. alpha冲刺第五天

    一.合照 二.项目燃尽图 三.项目进展 调整了一些界面的布局 细化了部分小功能的界面 注册界面和服务器响应了,但是在insert数据库方面出现了错误 四.明日规划 继续研究如何将注册的内容插入数据库 ...

  2. beta冲刺4-咸鱼

    昨天的问题: 我的社团数据库表项的处理,代码修改后结果无法显示. 帖子内容无法显示出来. 首页图像未替换 登陆整合没有完成 今天的完成: 服务器部署成功 页面背景修改.(已上传,未确认实装.) 任务截 ...

  3. 小草手把手教你LabVIEW串口仪器控制—安装使用仪器现有驱动

    声明:很多仪器是没有驱动的.所以,具体问题具体分析.另外声明:所谓的驱动,也就是封装好的底层的串口通信程序,也是程序而已,只不过别人帮你做成了子 VI,让自己容易用.所以:不要弄混淆了概念.国外的很多 ...

  4. labview与单片机串口通信

    labview与单片机串口通信   VISA是虚拟仪器软件体系结构的缩写(即Virtual Instruments Software Architecture),实质上是一个I/O口软件库及其规范的总 ...

  5. Flask 学习 七 用户认证

    使用werkzeug 实现密码散列 from werkzeug.security import generate_password_hash,check_password_hash class Use ...

  6. 2017 国庆湖南 Day6

    期望得分:100+100+60=260 实际得分:100+85+0=185 二分最后一条相交线段的位置 #include<cstdio> #include<iostream> ...

  7. DELL EqualLogic PS存储硬盘故障数据恢复成功案例分享

    DELL EqualLogic PS4000采用虚拟ISCSI SAN阵列,为远程或分支办公室.部门和中小企业存储部署带来企业级功能.智能化.自动化和可靠性.以简化的管理.快速的部署及合理的价格满足了 ...

  8. kali使用

    1.kali安装后安装vmtools ①.vim /etc/apt/sources.list 添加中科大滚动版更新源 deb http://mirrors.ustc.edu.cn/kali kali- ...

  9. gradle入门(1-7)eclipse和gradle集成插件的安装和使用

    一.安装gradle插件:buildship 1.安装插件 gradle默认的本地缓存库在c盘user目录下的.gradle文件夹下,安装好gradle后,可以添加环境变量GRADLE_USER_HO ...

  10. c#**************

    ddfbvbb c v我wossssssss