设f[i][j]为第i张图中j点所在连通块的编号,加边时可以通过启发式合并在$O(dn\log n)$的时间内维护出来。

对于每个点,设h[i]为f[j][i]的hash值,若两个点hash值相等,则它们在d张图中均连通。

#include<cstdio>
typedef unsigned long long ll;
const int D=200,N=5002,M=262143;
int d,n,m,i,j,x,y,z,ans;
int f[D][N],s[D][N],g[D][N],v[D*N*2],nxt[D*N*2],ed;
ll pow[D],h[N];
struct E{ll v;int w,nxt;}e[N];
int G[M+1],res[N],cur;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int z,int x,int y){v[++ed]=y;nxt[ed]=g[z][x];g[z][x]=ed;}
inline void ins(ll v){
int u=v&M,i=G[u];
for(;i;i=e[i].nxt)if(e[i].v==v){ans+=e[i].w*2+1;e[i].w++;return;}
ans++,e[i=res[cur--]].v=v,e[i].w=1,e[i].nxt=G[u],G[u]=i;
}
inline void del(ll v){
int u=v&M,i=G[u],j=i;
if(e[i].v==v){
ans-=e[i].w*2-1;
if(!(--e[i].w))G[u]=e[res[++cur]=i].nxt;
return;
}
for(i=e[i].nxt;i;j=i,i=e[i].nxt)if(e[i].v==v){
ans-=e[i].w*2-1;
if(!(--e[i].w))e[j].nxt=e[res[++cur]=i].nxt;
return;
}
}
void dfs(int z,int x,int y,int t){
del(h[x]);
h[x]-=pow[z]*f[z][x];
f[z][x]=t;
ins(h[x]+=pow[z]*t);
for(int i=g[z][x];i;i=nxt[i])if(v[i]!=y)dfs(z,v[i],x,t);
}
inline void merge(int z,int x,int y){
if(f[z][x]==f[z][y])return;
if(s[z][f[z][x]]>s[z][f[z][y]]){int t=x;x=y;y=t;}
s[z][f[z][y]]+=s[z][f[z][x]];
add(z,x,y),add(z,y,x);
dfs(z,x,y,f[z][y]);
}
int main(){
read(d),read(n),read(m);
for(pow[0]=i=1;i<d;i++)pow[i]=pow[i-1]*10007;
for(i=1;i<=n;i++)res[++cur]=i;
for(i=1;i<=n;ins(h[i++]))for(j=0;j<d;j++)f[j][i]=i,s[j][i]=1,h[i]+=pow[j]*i;
while(m--)read(x),read(y),read(z),merge(--z,x,y),printf("%d\n",ans);
return 0;
}

  

最新文章

  1. 网络基本概念备忘:MAC地址,端口,HTTP状态码
  2. mac os 基本命令
  3. 在本地(Eclipse)运行第一个strom-starter例子
  4. 【JQGRID DOCUMENTATION】.学习笔记.2.基本表格
  5. 转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
  6. CentOS5.5上安装git
  7. springMVC学习笔记二
  8. Canvas模糊化处理图片、毛玻璃处理图片之stackblur.js
  9. (3)选择元素——(15)总结(Summary)
  10. LeetCode_Surrounded Regions
  11. MyEclipse 中文注释乱码
  12. 虚拟桌面 VDI
  13. Spring MVC控制层传递对象后在JSP页面中的取值方法
  14. DWM1000 巧用Status 快速Debug
  15. 如何在QFileSystemModel中显示文件夹的大小
  16. oracle查询2G以上的表
  17. PHP5.6 和PHP7.0区别
  18. 记录一起k8s的service服务名解析灵异事件
  19. linux timer operate
  20. mongodb mongotemplate聚合

热门文章

  1. MySQL数据库服务器的架设
  2. [BZOJ1202][HNOI2005]狡猾的商人
  3. 配置oss bucket cors
  4. (部署新java程序,程序报错,需copy的一个包)——java使用siger 获取服务器硬件信息
  5. Selenium webdriver 学习总结-元素定位
  6. PHP--TP框架----把查询到的数据,显示在模型(模板)里面
  7. Light OJ 1393 Crazy Calendar (尼姆博弈)
  8. MVC准备前基础知识
  9. 使yum保留下载的rpm包
  10. UVa 11437:Triangle Fun(计算几何综合应用,求直线交点,向量运算,求三角形面积)