BZOJ.4298.[ONTAK2015]Bajtocja(Hash 启发式合并)
\(Description\)
给定\(d\)张无向图,每张图都有\(n\)个点。一开始,在任何一张图中都没有任何边。
接下来有\(m\)次操作,每次操作会给出\(a,b,k\),意为在第\(k\)张图中的点\(a\)和点\(b\)之间添加一条无向边。
你需要在每次操作之后输出有序数对\((a,b)\)的个数,满足\(1\leq a,b\leq n\),且\(a\)点和\(b\)点在\(d\)张图中都连通。
\(d\leq 200,n\leq 5000,m\leq 1000000\)
\(Solution\)
我们需要知道的只是每对点之间是否连通,即在同一张图所属的连通块是否一样
于是我们对每个点在d张图中所属的连通块标号进行哈希,这个哈希要能快速删除一个标号 插入一个标号
如果有两个点哈希后的值相同,那么这两个点在d张图中都连通。于是我们再对这个哈希值做一遍哈希,来计算相同哈希值的个数
连边时用启发式合并,每次将size小的连通块全部修改fa,总复杂度\(O(dn\log n)\)
//75500kb 4628ms
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
typedef unsigned long long ull;
const int N=5005,D=205,M=1e6+5,mod=2e6;
const ull seed=769;
int n,m,d,H[D][N],Enum,to[M<<1],nxt[M<<1],fa[D][N],sz[D][N],Ans;
ull hs_id[N],Pow[D];
struct Hash_Table
{
int top,h_H[mod+5],sk[mod],h_nxt[mod],cnt[mod];
ull val[mod];
void Init()
{
top=mod-5;
for(int i=1; i<=top; ++i) sk[i]=i;
}
void Insert(ull x)
{
int p=x%mod;
for(int i=h_H[p]; i; i=h_nxt[i])
if(val[i]==x) {Ans+=2*cnt[i]+1,++cnt[i]; return;}
++Ans;//(a,a)也算一对
int pos=sk[top--];
val[pos]=x, cnt[pos]=1, h_nxt[pos]=h_H[p], h_H[p]=pos;
}
void Delete(ull x)
{
int p=x%mod,pre=h_H[p];
if(val[pre]==x)
{
Ans-=2*cnt[pre]-1;
if(!--cnt[pre]) sk[++top]=pre, h_H[p]=h_nxt[pre];
}
else
for(int i=h_nxt[pre]; i; pre=i,i=h_nxt[i])
if(val[i]==x)
{
Ans-=2*cnt[i]-1;
if(!--cnt[i]) sk[++top]=i, h_nxt[pre]=h_nxt[i];
break;
}
}
}hs2;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline void AddEdge(int u,int v,int k){
to[++Enum]=v, nxt[Enum]=H[k][u], H[k][u]=Enum;
}
void DFS(int x,int f,int k,int anc)
{
hs2.Delete(hs_id[x]);
hs_id[x]-=Pow[k]*fa[k][x];//fa就是belong了
fa[k][x]=anc;
hs_id[x]+=Pow[k]*anc;
hs2.Insert(hs_id[x]);
for(int i=H[k][x]; i; i=nxt[i])
if(to[i]!=f) DFS(to[i],x,k,anc);
}
void Union(int u,int v,int k)
{
if(fa[k][u]==fa[k][v]) return;
if(sz[k][fa[k][u]]<sz[k][fa[k][v]]) std::swap(u,v);
sz[k][fa[k][u]]+=sz[k][fa[k][v]];
DFS(v,u,k,fa[k][u]);
AddEdge(u,v,k),AddEdge(v,u,k);
}
int main()
{
d=read(),n=read(),m=read();
Pow[0]=1;
for(int i=1; i<D; ++i) Pow[i]=Pow[i-1]*seed;
hs2.Init();
for(int i=1; i<=n; hs2.Insert(hs_id[i++]))
for(int j=1; j<=d; ++j)
fa[j][i]=i, sz[j][i]=1, hs_id[i]+=Pow[j]*i;//Hash = (∑s[i]seed^i) mod 2^{31}
int a,b,k;
while(m--)
a=read(),b=read(),k=read(),Union(a,b,k),printf("%d\n",Ans);
return 0;
}
BZOJ.4298.[ONTAK2015]Bajtocja(Hash 启发式合并)的更多相关文章
- bzoj 4298 [ONTAK2015]Bajtocja——哈希+启发式合并
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4298 题面: 给定d张无向图,每张图都有n个点.一开始,在任何一张图中都没有任何边.接下来有 ...
- @bzoj - 4298@ [ONTAK2015]Bajtocja
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定d张无向图,每张图都有n个点.一开始,在任何一张图中都没有任 ...
- BZOJ 2809: [Apio2012]dispatching( 平衡树 + 启发式合并 )
枚举树上的每个结点做管理者, 贪心地取其子树中薪水较低的, 算出这个结点为管理者的满意度, 更新答案. 用平衡树+启发式合并, 时间复杂度为O(N log²N) ------------------- ...
- BZOJ 3545: [ONTAK2010]Peaks( BST + 启发式合并 + 并查集 )
这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是 ...
- BZOJ 2888 资源运输(启发式合并LCT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2888 [题目大意] 不断加边,问每个连通块的重心到其它点的距离和的和 [题解] 启发式 ...
- BZOJ 3545: [ONTAK2010]Peaks [Splay启发式合并]
3545: [ONTAK2010]Peaks 题意:带权图,多组询问与一个点通过边权\(\le x\)的边连通的点中点权k大值 又读错题了,输出点一直WA,问的是点权啊 本题加强版强制在线了,那这道题 ...
- bzoj 1483: [HNOI2009]梦幻布丁 启发式合并vector
1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description N个 ...
- BZOJ 1483 梦幻布丁(链表+启发式合并)
给出一个长度为n的序列.支持两种操作: 1.把全部值为x的修改成y.2.询问序列有多少连续段. 我们可以对于每个值建立一个链表.对于操作1,则可以将两个链表合并. 对于操作2,只需要在每次合并链表的时 ...
- BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
随机推荐
- 【转】inotify+rsync实现实时同步
[转]inotify+rsync实现实时同步 1.1 什么是实时同步:如何实现实时同步 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化 发现目录中数据产生变化,就利用rsync服 ...
- Linux 调优方案, 修改最大连接数(ulimit命令)【转】
转自:http://blog.csdn.net/liangxiaozhang/article/details/8363435 Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源 ...
- asp.net动态解析用户控件(UserControl)
模块化的时候需要用到: #region asp.net解析用户控件 /// <summary> /// asp.net 解析用户控件 /// </summary> /// &l ...
- Android 图片平铺效果
我们大家都看过平铺的效果,那么我们都是怎么样才能实现的那,我们其实主要用到的就是api,我们一开始new一个bitmap,就可以了,但是,大家都没有想过,我们还可以用什么方法来做这个事情那,那么我们就 ...
- Day6------------复习
文件归档:tar cvf test.tar 文件压缩:gzip 目标文件 bzip2 test,tar 文件解压:gunzip test.tar.gz bzip2 test.tar.bz2 文件打包压 ...
- OneNET麒麟座应用开发之四:数据上传测试
已经测试过OneNET麒麟座开发板了,这次来尝试与OneNET的连接和数据上传.这也是我们测试这块开发办的主要原因,因为在十几种我们有这种将分散的采集点数据上传到后台的需求. 先看看麒麟座这块开发板, ...
- 测试开发之Django——No8.Django中的视图与URL配置
在Django中,页面内容是靠views function(视图函数)来产生,URL定义在URLconf中. 这是一个纯净项目的url配置文件,他存在的目录,是与setting文件在同一个目录中. u ...
- CNN中各种各样的卷积
https://zhuanlan.zhihu.com/p/29367273 https://zhuanlan.zhihu.com/p/28749411 以及1*1卷积核:https://www.zhi ...
- TCP/IP、Http大纲
TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据.关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只 ...
- Codeforces 519D A and B and Interesting Substrings(二维map+前缀和)
题目链接:http://codeforces.com/problemset/problem/519/D 题目大意:给你一串字符串s仅由小写字母组成,并且对于'a'~'z'都给了一个值.求子串t满足t的 ...