染色(dye)
染色(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)的更多相关文章
- POJ 1466 Girls and Boys 黑白染色 + 二分匹配 (最大独立集) 好题
有n个人, 其中有男生和女生,接着有n行,分别给出了每一个人暗恋的对象(不止暗恋一个) 现在要从这n个人中找出一个最大集合,满足这个集合中的任意2个人,都没有暗恋这种关系. 输出集合的元素个数. 刚开 ...
- 【分解爪UVA11396-二分图染色模板】
·Rujia:"稍加推理即可解决该题--" ·英文题,述大意: 一张无向连通图,每个点连有三条边.询问是否可以将这个图分成若干个爪子,并满足条件:①每条边只能属于一个爪子 ...
- bzoj2243树链剖分+染色段数
终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开 ...
- 51nod 算法马拉松18 A 染色问题
染色问题 基准时间限制:1 秒 空间限制:10240 KB 分值: 40 一个n(3<=n<=100)个点的完全图,现在给出n,要求将每条边都染上一种颜色k(1<=k<=n), ...
- BZOJ 2243: [SDOI2011]染色 [树链剖分]
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6651 Solved: 2432[Submit][Status ...
- NOIP2008双栈排序[二分图染色|栈|DP]
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷P1330封锁阳光大学[二分图染色]
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]
Knights of the Round Table Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 12439 Acce ...
- NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
随机推荐
- ssrf对redis未授权访问写webshell
docker建立redis镜像 docker run -d -p 9999:6379 redis 将redis的6379端口映射到物理机的9999端口 使用工具生成攻击代码 攻击 进入容器查看
- css中的zoom的作用
1.检查页面的标签是否闭合不要小看这条,也许折腾了你两天都没有解决的 CSS BUG 问题, 却仅仅源于这里.毕竟页面的模板一般都是由开发来嵌套的,而 他们很容易犯此类问题.快捷提示:可以用 Drea ...
- 连接mysql并查询
1.将mysql-connector-java-5.1.7-bin.jar放入Jmeter安装目录的bin文件夹中 2.在顶层目录<测试计划>中加载驱动 3.添加JDBC Connecti ...
- 生产环境Docker部署ELK跨区访问kafka不通问题的解决
由于分布式系统的日志集中采集的需求非常强烈,我们组通过调研和实践搭建了一套基于Docker的日志收集系统Amethyst. 我们首先在测试环境搭建了一套基于Docker swarm集群的ELK分布式环 ...
- verifier 调试内存泄露
没啥技术含量,都是老段子了, 这次记下来,只是我想说,我也做过,留个念相. 前置条件,电脑里面必须得有Verifier,有了之后把自己的驱动加进去, WinDBG上双机,然后就可以跑了,跑一段时间就可 ...
- Ansible实现批量无密码登录
如果机器多,假如有一百台服务器,每台服务器登录前都得先输入yes,使用交互式的方式下发公钥的话就很麻烦(ssh-copy-id). 第一次操作需要通过密码来操作服务器,所以配置文件需要把密码配置好 a ...
- 【数位DP】CF55D Beautiful numbers
$dp[x][p][pp]$表示第x位,当前已有数字mod 2520(1~9数字的lcm)为p,当前各位数字的lcm为pp 观察到数组太大,考虑压缩,第三维lcm最多只有9个数字,打表发现最多只有48 ...
- this 、typeof、false、parseInt()、this、arguments、Array和object判断
typeof typeof (undefined) 不会报错 undefined object Number boolean function String 返回值为字符串类型 false .fals ...
- MySQL安装pdf介绍
pdf地址:https://files.cnblogs.com/files/pygo/mysql%E5%AE%89%E8%A3%85.pdf
- 重磅发布: 阿里云WAF日志实时分析上线 (含视频)
摘要: 阿里云WAF与日志服务打通,对外开发Web访问与攻击日志.提供近实时的网站具体的日志自动采集存储.并提供基于日志服务的查询分析.报表报警.下游计算对接与投递的能力. 背景 Web攻击形势 互联 ...