Stamp Rally
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相关推荐
- AGC002[BCDEF]题解
F是计数于是就做(kan ti jie)了= = B - Box and Ball 模拟一下 每个盒子开一个d表示有的球数 可能存在红球的打个标记 传递一下就行了 #include<cstdio ...
- AGC002(D~F)【Kruskal重构树,博弈论,dp】
正题 AT1998 [AGC002D] Stamp Rally[Kruskal重构树,倍增] https://www.luogu.com.cn/problem/AT1998 题目大意 给出nnn个点m ...
- 省选+NOI 第六部分 技巧与思想
分块 分块入门 分块入门_ACM败犬的博客-CSDN博客 分块算法总结 分块算法总结_劭星の博客-CSDN博客 数列分块入门(2019.8.15训练) 数列分块入门(2019.8.15训练)_nefu ...
- 基础省选+NOI-第1部分 数据结构进阶(I)
1.莫队 HRBU ACM 莫队 线段树 树状数组_哔哩哔哩_bilibili 莫队+ST表综合题 洛谷p3246[HNOI]序列_哔哩哔哩_bilibili 0325[莫队2]_哔哩哔哩_bilib ...
- R语言完美重现STAMP结果图
写在前面 之前写过一篇关于统计学软件STAMP的教程,使用STAMP对微生物群落数据进行统计学分析还是挺方便的,尤其是对R语言不是很熟悉的朋友来说,图形化的界面和相对简单的操作还是挺友好的. STAM ...
- OpenStack Rally 质量评估与自动化测试利器
目录 文章目录 目录 问题描述 Rally 简介 应用场景 应用案例 Rally 安装 Rally 使用 Rally 架构 Rally Plugin 分析与实现 程序入口 执行 rally task ...
- linux tar 提示 time stamp xxx in the future 解决方法
在A机器上用tar压缩的文件,在B机器上进行解包的时候,如果两个机器的时间不一致,如B机器的时间落后A机器的时间,这时 就会出现time stamp in the future的问题.如何解决这个问题 ...
- Code Rally 2015 编程锦标赛启动,智能手表,iPad 大奖等你来拿!
Code Rally 2015 编程锦标赛是由 IBM 和 InfoQ 主办的年度系列活动.Code Rally 2015 是一场以免费与开源为特色的竞速游戏--与传统意义上的赛道竞速不同,在这里,参 ...
- [BZOJ3832][Poi2014]Rally
[BZOJ3832][Poi2014]Rally 试题描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byt ...
最新文章
- php 实现一致性hash 算法 memcache
- Visual Code 快捷创建HTML,CSS和Class
- 深度学习(17)TensorFlow高阶操作六: 高阶OP
- 线性代数 矩阵 行列式基本知识(转)
- Dubbo xml配置 和注解配置 写法
- Fliptile【搜索】
- web开发常用工具介绍
- 水滴石穿C语言之static辨析
- leetcode - 617. 合并二叉树
- python判断日期为第几天_python怎么判断某一天是一年中的第几天
- element中form表单resetFields()方法重置表单无效
- matlab软件编程求解方程实验报告,数学实验“线性方程组高斯消去法”实验报告内含matlab程序.doc...
- c char转int_C/C++基础之sizeof使用
- 2021高考成绩河北查询时间,2021年高考成绩什么时候出来-2021高考成绩公布时间...
- 利用向量求点到线的最短距离
- 用JAVA不失精度计算等额本息还款列表
- 一种依靠压缩电磁铁制造暗物质虫洞的机器
- 基于STM32的多功能MP3设计 毕业设计(论文)文献综述
- python怎么变白-Python将png透明变为白色并保存为jpg图片
- echart 三维可视化地图_Echarts三维坐标系