Stamp Rally

最大值最小,可以二分,然后并查集看能不能到z个点

但是询问过多,并且发现每次二分要加入的点并不是所有的m条边

于是就考虑整体二分

并查集的处理是重点:

对于一般的dfs分治树,

我们必然要在处理前面部分回溯来的时候,递归右子树之前,左子树并查集的信息必须保留。

但是还要删除当前层的部分并查集的合并操作。

如果直接路径压缩+暴力重构的话,到了后面,每次重构就是O(n)的了,直接N^2了。

为了支持删除,就考虑按秩合并。

合并成功的时候,用一个栈记录pair,然后删除的时候弹栈删除即可。相当于时光倒流

当然,之前的合并一定不能撤销的。

出错点:

1.l打成1海星。。。

2.如果当前区间没有决策位置的话,可以直接返回,但是这些[l,r]编号的边不能扔掉,必须直接加进去。

#include<bits/stdc++.h>
#define il inline
#define reg register int
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){char ch;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=1e5+5;
const int M=1e5+5;
struct node{int x,y;
}e[M];
struct que{int x1,x2,z;int id,ans;
}q[M],b[M];
int fa[N];
int sz[N];
int op[N];
int n,m;
int fin(int x){return fa[x]==x?x:fin(fa[x]);
}
pair<int,int>sta[N];
int top;
void merge(int x,int y,bool fl){int k1=fin(x),k2=fin(y);if(k1!=k2){if(sz[k1]>sz[k2]) swap(k1,k2);fa[k1]=k2;sz[k2]+=sz[k1];if(fl)sta[++top]=make_pair(k1,k2);    }
}
void dele(int x,int y){fa[x]=x;sz[y]-=sz[x];
}
void divi(int l,int r,int le,int ri){//cout<<"  l r "<<l<<" "<<r<<" : "<<le<<" and "<<ri<<endl;if(l>r) return;if(le>ri){for(reg i=l;i<=r;++i){merge(e[i].x,e[i].y,0);}return;}if(l==r){for(reg i=le;i<=ri;++i){q[i].ans=l;}merge(e[l].x,e[l].y,0);return;}int mid=(l+r)>>1;for(reg i=l;i<=mid;++i){merge(e[i].x,e[i].y,1);}//cout<<" mid "<<mid<<endl;int pre=le-1,bac=ri+1;for(reg i=le;i<=ri;++i){int k1=fin(q[i].x1),k2=fin(q[i].x2);int tmp=0;if(k1!=k2){tmp=sz[k1]+sz[k2];    }else{tmp=sz[k1];}if(tmp>=q[i].z) b[++pre]=q[i]; else b[--bac]=q[i];}for(reg i=le;i<=ri;++i){q[i]=b[i];}//cout<<" pre "<<pre<<" bac "<<bac<<" top "<<top<<endl;//if(top){while(top){dele(sta[top].first,sta[top].second);--top;}//}
    divi(l,mid,le,pre);divi(mid+1,r,bac,ri);
}
int main(){rd(n);rd(m);for(reg i=1;i<=m;++i){rd(e[i].x);rd(e[i].y);}int que;rd(que);for(reg i=1;i<=que;++i){rd(q[i].x1);rd(q[i].x2);rd(q[i].z);q[i].id=i;}for(reg i=1;i<=n;++i){fa[i]=i;sz[i]=1;//;dep[i]=1;
    }divi(1,m,1,que);for(reg i=1;i<=que;++i){op[q[i].id]=q[i].ans;}for(reg i=1;i<=que;++i){printf("%d\n",op[i]);}return 0;
}}
signed main(){
//    freopen("data.in","r",stdin);
//    freopen("my.out","w",stdout);
    Miracle::main();return 0;
}/*Author: *Miracle*Date: 2018/12/18 8:37:44
*/

还有一种:

你不是暴力重构会TLE吗?但是我一共就需要循环logn次O(m)地把并查集加入

考虑逐层处理

因为对于整体二分,bfs和dfs的顺序都没有问题。

所以bfs处理整体二分,这样,加入就直接加入了,只要暴力重构O(logn)次。

bfs+路径压缩,理论上可以更快一些。

转载于:https://www.cnblogs.com/Miracevin/p/10135489.html

Stamp Rally相关推荐

  1. AGC002[BCDEF]题解

    F是计数于是就做(kan ti jie)了= = B - Box and Ball 模拟一下 每个盒子开一个d表示有的球数 可能存在红球的打个标记 传递一下就行了 #include<cstdio ...

  2. AGC002(D~F)【Kruskal重构树,博弈论,dp】

    正题 AT1998 [AGC002D] Stamp Rally[Kruskal重构树,倍增] https://www.luogu.com.cn/problem/AT1998 题目大意 给出nnn个点m ...

  3. 省选+NOI 第六部分 技巧与思想

    分块 分块入门 分块入门_ACM败犬的博客-CSDN博客 分块算法总结 分块算法总结_劭星の博客-CSDN博客 数列分块入门(2019.8.15训练) 数列分块入门(2019.8.15训练)_nefu ...

  4. 基础省选+NOI-第1部分 数据结构进阶(I)

    1.莫队 HRBU ACM 莫队 线段树 树状数组_哔哩哔哩_bilibili 莫队+ST表综合题 洛谷p3246[HNOI]序列_哔哩哔哩_bilibili 0325[莫队2]_哔哩哔哩_bilib ...

  5. R语言完美重现STAMP结果图

    写在前面 之前写过一篇关于统计学软件STAMP的教程,使用STAMP对微生物群落数据进行统计学分析还是挺方便的,尤其是对R语言不是很熟悉的朋友来说,图形化的界面和相对简单的操作还是挺友好的. STAM ...

  6. OpenStack Rally 质量评估与自动化测试利器

    目录 文章目录 目录 问题描述 Rally 简介 应用场景 应用案例 Rally 安装 Rally 使用 Rally 架构 Rally Plugin 分析与实现 程序入口 执行 rally task ...

  7. linux tar 提示 time stamp xxx in the future 解决方法

    在A机器上用tar压缩的文件,在B机器上进行解包的时候,如果两个机器的时间不一致,如B机器的时间落后A机器的时间,这时 就会出现time stamp in the future的问题.如何解决这个问题 ...

  8. Code Rally 2015 编程锦标赛启动,智能手表,iPad 大奖等你来拿!

    Code Rally 2015 编程锦标赛是由 IBM 和 InfoQ 主办的年度系列活动.Code Rally 2015 是一场以免费与开源为特色的竞速游戏--与传统意义上的赛道竞速不同,在这里,参 ...

  9. [BZOJ3832][Poi2014]Rally

    [BZOJ3832][Poi2014]Rally 试题描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byt ...

最新文章

  1. php 实现一致性hash 算法 memcache
  2. Visual Code 快捷创建HTML,CSS和Class
  3. 深度学习(17)TensorFlow高阶操作六: 高阶OP
  4. 线性代数 矩阵 行列式基本知识(转)
  5. Dubbo xml配置 和注解配置 写法
  6. Fliptile【搜索】
  7. web开发常用工具介绍
  8. 水滴石穿C语言之static辨析
  9. leetcode - 617. 合并二叉树
  10. python判断日期为第几天_python怎么判断某一天是一年中的第几天
  11. element中form表单resetFields()方法重置表单无效
  12. matlab软件编程求解方程实验报告,数学实验“线性方程组高斯消去法”实验报告内含matlab程序.doc...
  13. c char转int_C/C++基础之sizeof使用
  14. 2021高考成绩河北查询时间,2021年高考成绩什么时候出来-2021高考成绩公布时间...
  15. 利用向量求点到线的最短距离
  16. 用JAVA不失精度计算等额本息还款列表
  17. 一种依靠压缩电磁铁制造暗物质虫洞的机器
  18. 基于STM32的多功能MP3设计 毕业设计(论文)文献综述
  19. python怎么变白-Python将png透明变为白色并保存为jpg图片
  20. echart 三维可视化地图_Echarts三维坐标系

热门文章

  1. Myeclipse 安装所有插件
  2. java读取request中的xml
  3. 洛谷 P1352 没有上司的舞会【树形DP/邻接链表+链式前向星】
  4. [转]云计算:SaaS、PaaS、IaaS、CaaS
  5. HashMap散列无序存储测试
  6. 【官方速报】360开源又一力作——KafkaBridge:让操作kafka更简单!
  7. 奇虎360WEB平台部招贤纳士之产品经理、开发工程师
  8. Java 线程池的简单使用及介绍
  9. 三分钟掌握Go mod常用与高级操作
  10. Laravel框架性能优化