bzoj 4298 [ONTAK2015]Bajtocja——哈希+启发式合并
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4298
题面:
给定d张无向图,每张图都有n个点。一开始,在任何一张图中都没有任何边。接下来有m次操作,每次操作会给出a,b,k,意为在第k张图中的点a和点b之间添加一条无向边。你需要在每次操作之后输出有序数对(a,b)的个数,使得1<=a,b<=n,且a点和b点在d张图中都连通。
与连通性有关,那么就是并查集咯。
但在一个图里连通了两个点集之后,难道要遍历该点集所有点对,看看在其他图里是否连通?
1.启发式合并。那么对答案的影响,可以考虑落在 “新加入该点集” 的那些点上。
2.考虑 “与一个点在 d 张图里都连通的点的个数” 。
连通意味着处在同一个连通块中。那么记录每个点在 d 张图中分别属于哪些连通块,这形成一个字符串。
哈希记录某个字符串对应的点数即可。
需要用哈希表,而且消失的哈希值要从哈希表里删除,才能不超时。即使这样,自己还是平均时间的两倍。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#define ll long long
#define ull unsigned long long
#define pb push_back
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
int g[];
void wrt(ll x)
{
if(!x){puts("");return;}
int t=;
while(x)g[++t]=x%,x/=;
for(int i=t;i;i--)putchar(g[i]+'');puts("");
}
const int N=,M=,bs=,M2=N*M*;
int n,m,D,fa[N][M],siz[N][M],ct[M2];
ll ans; ull bin[M],hs[N];
vector<int> vt[N][M];
namespace H{
const int md=3e7;
int hd[md],xnt,nxt[M2]; ull to[M2];
int get(ull x)
{
int h=x%md;
for(int i=hd[h];i;i=nxt[i])
if(to[i]==x)return i;
to[++xnt]=x; nxt[xnt]=hd[h]; hd[h]=xnt;
return xnt;
}
void del(ull x)
{
int h=x%md;
if(to[hd[h]]==x){hd[h]=nxt[hd[h]];return;}
for(int i=hd[h],lst=;i;lst=i,i=nxt[i])
if(to[i]==x){nxt[lst]=nxt[i];break;}
}
}
int main()
{
D=rdn();n=rdn();m=rdn();
bin[]=;for(int i=;i<=D;i++)bin[i]=bin[i-]*bs;
for(int i=;i<=n;i++)
{
for(int j=;j<=D;j++)
{
fa[i][j]=i; siz[i][j]=;
vt[i][j].pb(i); hs[i]+=i*bin[j];
}
ct[H::get(hs[i])]++;
}
ans=n;
for(int i=,u,v,d;i<=m;i++)
{
u=rdn();v=rdn();d=rdn();
u=fa[u][d]; v=fa[v][d];
if(u==v){wrt(ans);continue;}
if(siz[u][d]<siz[v][d])swap(u,v);
int tot=siz[u][d];
siz[u][d]+=siz[v][d]; vt[u][d].resize(siz[u][d]);
ull tmp=(u-v)*bin[d];
for(int j=,cr;j<siz[v][d];j++)
{
cr=vt[v][d][j]; fa[cr][d]=u; vt[u][d][tot++]=cr;
ull x=hs[cr],y=hs[cr]+tmp; hs[cr]+=tmp;
int t0=H::get(x),t1=H::get(y);
ct[t0]--; ans-=ct[t0]*; ans+=ct[t1]*; ct[t1]++;
}
vector<int> ().swap(vt[v][d]);
wrt(ans);
}
return ;
}
bzoj 4298 [ONTAK2015]Bajtocja——哈希+启发式合并的更多相关文章
- BZOJ.4298.[ONTAK2015]Bajtocja(Hash 启发式合并)
题目链接 \(Description\) 给定\(d\)张无向图,每张图都有\(n\)个点.一开始,在任何一张图中都没有任何边. 接下来有\(m\)次操作,每次操作会给出\(a,b,k\),意为在第\ ...
- @bzoj - 4298@ [ONTAK2015]Bajtocja
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定d张无向图,每张图都有n个点.一开始,在任何一张图中都没有任 ...
- BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 1483: [HNOI2009]梦幻布丁( 链表 + 启发式合并 )
把相同颜色的串成一个链表, 然后每次A操作就启发式合并, 然后计算对答案的影响. ----------------------------------------------------------- ...
- BZOJ 3123: [Sdoi2013]森林 [主席树启发式合并]
3123: [Sdoi2013]森林 题意:一个森林,加边,询问路径上k小值.保证任意时刻是森林 LCT没法搞,树上kth肯定要用树上主席树 加边?启发式合并就好了,小的树dfs重建一下 注意 测试点 ...
- bzoj 1483: [HNOI2009]梦幻布丁 (链表启发式合并)
Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色. 例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input ...
- BZOJ 2733 [HNOI2012]永无乡 - 启发式合并主席树
Description 1: 查询一个集合内的K大值 2: 合并两个集合 Solution 启发式合并主席树板子 Code #include<cstdio> #include<cst ...
- bzoj 2809 左偏树\平衡树启发式合并
首先我们对于一颗树,要选取最多的节点使得代价和不超过m,那么我们可以对于每一个节点维护一个平衡树,平衡树维护代价以及代价的和,那么我们可以在logn的时间内求出这个子树最多选取的节点数,然后对于一个节 ...
- BZOJ 4919: [Lydsy1706月赛]大根堆 启发式合并
我不会告诉你这是线段树合并的好题的... 好吧我们可以搞一个multiset在dfs时求出LIS(自带二分+排序)进行启发式合并,轻松加愉悦... #include<cstdio> #in ...
随机推荐
- echart 柱状图 两个纵轴坐标 刻度不一样
在使用echart的过程中, 有的时候柱状图会使用两个纵坐标, 如果两个纵坐标的最大值是一样的还好,这样刻度也会一样. 但是多数情况下最大值是不一样的, 这样就造成了,刻度线很乱,显示不均匀. 解决办 ...
- 编写Servlet步骤以及Servlet生命周期是怎样的
一.编写Servlet步骤 1.继承HttpServlet,HttpServlet在javax-servlet-api依赖下 2.重写doGet()或者doPost()方法 3.在web.xml中注册 ...
- Tarjan水题系列(3):HNOI2006 潘多拉的魔盒
题目: 链接 大意: 盒子与盒子之间的关系构成一个有向图 求图上包含节点数最多的路径的节点数 思路: 有向图上求包含节点数最多的路径的节点数 可直接使用tarjan缩点后拓扑dp求得 在此不赘述 此题 ...
- MyBatis一个对多个主键(索引)生成实体类的处理
原数据库表: 生成实体类,多出了一个xxKey.java
- http-proxy-middleware
概述 这是设置代理的神器,webpack的devServer.proxy就是使用了非常强大的 http-proxy-middleware 包.Node.js代理很简单. 轻松配置代理中间件进行连接,发 ...
- Django文档——Model中的ForeignKey,ManyToManyField与OneToOneField 关联关系字段 (Relationship fields)
ForeignKey,ManyToManyField与OneToOneField分别在Model中定义多对一,多对多,一对一关系. 例如,一本书由一家出版社出版,一家出版社可以出版很多书.一本书由多个 ...
- 利用webSocket实现浏览器中多个标签页之间的通信
webSoket用来实现双向通信,客户端和服务端实时通信. webSoket优点和缺点? 优点:对于前端来说,使用简单,功能灵活,如果部署了webSocket服务器,可以实现实时通信. 缺点:需要服务 ...
- django基础篇03-阶段总结
1.django的生命周期: url -> 路由系统 -> 视图函数(获取模版 + 数据 =>渲染) -> 返回字符串 2.路由系统: /index/ ->函数或类.as ...
- Nginx服务项的基本配置
由于Nginx配置项较多,把他们按照用户使用时的预期功能分为以下4类: 1.调试,定位问题的配置项 2.正常运行必备配置项 3.优化性能配置项 4.事件类配置项 1. 用于调试进程,定位问题的配置项 ...
- PAT Advanced 1027 Colors in Mars (20 分)
People in Mars represent the colors in their computers in a similar way as the Earth people. That is ...