染色(dye)

Description

Serene 和 Achen 在玩染色游戏。Serene 和 Achen 站在一个 n 个点 m 条边的无向连通图中,在第 i 次玩染色游戏时,Serene 在 a_i,Achen 在 b_i,并且所有节点都变为白色,在这次游戏中,Serene 和 Achen 会走过一些边,并且把路途中经过的所有点染成黑色,她们一共需要把 k_i 个点染成黑色(一个点如 果被染多次只计算一次)。

但是 Serene 和 Achen 不想太累,她们的劳累值是她们俩所经过的所有的边的最 大编号。Serene 想知道,每次玩染色游戏时 Serene 和 Achen 的最小的劳累值。

Input

一行两个整数 n,m

接下来 m 行每行两个数 x_i,y_i 表示编号为 i 的边所连接的两个点

接下来一行一个数 q,表示 Serene 和 Achen 做游戏的次数

接下来 q 行每行两个数 a_i,b_i,k_i 表示 Serene 和 Achen 的初始位置和需要染成黑色的点数

Output

q 行,对于每次游戏输出最小劳累值。

Sample Input

5 6

2 3

4 5

1 2

1 3

1 4

1 5

6

2 4 3

2 4 4

2 4 5

1 3 3

1 3 4

1 3 5

Sample Output

1

2

3

1

5

5

Hint

对于 20%的数据,n,m,q<=500

对于 60%的数据,n,m,q<=50000

对于 100%的数据,n,m,q<=200000

原题

整体二分。

二分的一个答案显然可以用并查集维护。

若是每次暴力从头建并查集肯定会死亡TLE。

于是用按秩合并的并查集,每次二分之后先往又区间走,往右走之后操作是往并查集里加。

走完不得不往左走时,把之前操作的后一半撤销。为了撤销强行开了个栈存操作。

然后奥妙地跑得比std快。

正解是整体二分时不按dfs序做而是按bfs序做。

//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
const int N=;
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
typedef long long LL;
using namespace std;
int n,m,q,fa[N],sz[N],ans[N]; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct edge {
int u,v,w;
}e[N]; struct node {
int x,y,k,id;
}qs[N],tp[N]; int find(int x) { return x==fa[x]?x:find(fa[x]); } struct op {
int x,fa,id;
op(){}
op(int x,int fa,int id):x(x),fa(fa),id(id){}
}sta[N*];
int top;
void solve(int l,int r,int ql,int qr,int f) {
if(l>r||ql>qr) return ;
if(l==r) {
For(i,ql,qr) ans[qs[i].id]=l;
return;
}
int mid=((l+r)>>);
int ll=ql-,rr=qr+;
if(f) {
For(i,l,mid) {
int x=find(e[i].u),y=find(e[i].v);
if(x!=y) {
if(sz[x]<=sz[y]) {
fa[x]=y,sz[y]+=sz[x];
sta[++top]=op(x,y,i);
}
else {
fa[y]=x,sz[x]+=sz[y];
sta[++top]=op(y,x,i);
}
}
}
}
For(i,ql,qr) {
int x=find(qs[i].x),y=find(qs[i].y);
if((x==y&&sz[x]>=qs[i].k)||(x!=y&&sz[x]+sz[y]>=qs[i].k)) tp[++ll]=qs[i];
else tp[--rr]=qs[i];
}
For(i,ql,qr) qs[i]=tp[i];
solve(mid+,r,rr,qr,);
Rep(i,top,) {
if(sta[i].id<=((l+mid)>>)) break;
int x=sta[i].x,f=sta[i].fa;
fa[x]=x; sz[f]-=sz[x]; top--;
}
solve(l,mid,ql,ll,);
} #define DEBUG
int main() {
#ifdef DEBUG
freopen("dye.in","r",stdin);
freopen("dye.out","w",stdout);
#endif
read(n); read(m);
For(i,,m) {
read(e[i].u); read(e[i].v);
e[i].w=i;
}
read(q);
For(i,,q) {
read(qs[i].x); read(qs[i].y);
read(qs[i].k); qs[i].id=i;
}
For(i,,n) fa[i]=i,sz[i]=;
solve(,m,,q,);
For(i,,q) printf("%d\n",ans[i]);
return ;
}
/*
5 6
2 3
4 5
1 2
1 3
1 4
1 5
6
2 4 3
2 4 4
2 4 5
1 3 3
1 3 4
1 3 5
*/

染色(dye)的更多相关文章

  1. POJ 1466 Girls and Boys 黑白染色 + 二分匹配 (最大独立集) 好题

    有n个人, 其中有男生和女生,接着有n行,分别给出了每一个人暗恋的对象(不止暗恋一个) 现在要从这n个人中找出一个最大集合,满足这个集合中的任意2个人,都没有暗恋这种关系. 输出集合的元素个数. 刚开 ...

  2. 【分解爪UVA11396-二分图染色模板】

    ·Rujia:"稍加推理即可解决该题--" ·英文题,述大意:      一张无向连通图,每个点连有三条边.询问是否可以将这个图分成若干个爪子,并满足条件:①每条边只能属于一个爪子 ...

  3. bzoj2243树链剖分+染色段数

    终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开 ...

  4. 51nod 算法马拉松18 A 染色问题

    染色问题 基准时间限制:1 秒 空间限制:10240 KB 分值: 40 一个n(3<=n<=100)个点的完全图,现在给出n,要求将每条边都染上一种颜色k(1<=k<=n), ...

  5. BZOJ 2243: [SDOI2011]染色 [树链剖分]

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6651  Solved: 2432[Submit][Status ...

  6. NOIP2008双栈排序[二分图染色|栈|DP]

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  7. 洛谷P1330封锁阳光大学[二分图染色]

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  8. POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 12439   Acce ...

  9. NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...

随机推荐

  1. Shiro术语

    请花2分钟阅读和理解Shiro中的术语 - 这是非常重要的.这里的术语和概念在文档中的任何地方都被引用,并且将大大简化您对Shiro和一般的安全性的理解. 因为使用了一些您可能不太明白的术语,所以安全 ...

  2. !!!myeclipse 上加载本地图片问题,无法加载问题

    出现无法加载本地图片的问题, 原因就是把图片放到了本地项目中的image了,但是myeclipse上没有刷新 这样以后 本地的图片比在线的要快 低级错误,诶!

  3. ps-奇幻金鱼彩妆

    1.打开背景图,拷贝一份防止出错 2增加色相饱和度 改变全局的饱和度.这是 为了改变嘴唇的颜色.其他变色的地方可以通过添加蒙版,然后用背景色为黑色的画笔擦掉 3给眼睛上加上金鱼  置入图片   类型选 ...

  4. HDU 2167 状压dp方格取数

    题意:给出一个数表,规定取出一个数后周围的八个数都不可取,求可获得的最大数字和 思路:状态压缩dp,每一行的取数方法为状态,显然,由于取数规则的限制,可取的状态并不是 1<<size_co ...

  5. SSH的两种登录方式以及配置

    前言 SSH简介 Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议.它是专为远程登录 ...

  6. maven中报错Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0

    在检索完工程后报错Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0. 由于oracle的ojdbc收费,所以在maven项目导入时没有ojdbc14 ...

  7. caffe安装 总结

    用的是matlab2018a,搞了一天 ubuntu 系统下的Caffe环境搭建 https://blog.csdn.net/hjimce/article/details/48781693 caffe ...

  8. 树莓派3b+ 实现视频监控

    设备:树莓派3B+.Raspberry Pi Camera sudo raspi-config #启动camera sudo reboot #监测摄像头是否安装成功 raspistill -o ima ...

  9. day16 python-04 字典

    Python之路,Day3 = Python基础4 # is 比较id # == 比较数值 # type(1) is type(2) 比较两个变量的类型是否相同 a = 1 b = 1 c = ' p ...

  10. luoguP1154 奶牛分厩 [数论]

    题目描述 农夫约翰有N(1<=N<=5000)头奶牛,每头奶牛都有一个唯一的不同于其它奶牛的编号Si,所有的奶牛都睡在一个有K个厩的谷仓中,厩的编号为0到K-1.每头奶牛都知道自己该睡在哪 ...