神秘TLE求调
查看原帖
神秘TLE求调
558877
linjingxiang楼主2025/1/22 12:19
#include<bits/stdc++.h>
#define pb push_back
#define ll unsigned long long
#define maxn 5005
#define mod 5003
using namespace std;
int d,n,m,f[205][maxn],ans,siz[205][maxn];
ll hsh[maxn],mi[205];
unordered_map<ll,int>mp;
vector<int>to[205][maxn];
inline void hs(int u,int k,int fa){
	ans-=mp[hsh[u]]*2-1,mp[hsh[u]]--;
	if(!mp[hsh[u]])mp.erase(hsh[u]);
	hsh[u]+=mi[k]*(fa-f[k][u]),f[k][u]=fa;
	mp[hsh[u]]++,ans+=mp[hsh[u]]*2-1;
}
inline void dfs(int k,int u,int fa){hs(u,k,fa);for(int v:to[k][u])dfs(k,v,fa);}
inline void l(int k,int a,int b){
	if(f[k][a]==f[k][b])return;
	if(siz[k][f[k][a]]<siz[k][f[k][b]])swap(a,b);
	siz[k][f[k][a]]+=siz[k][f[k][b]];
	to[k][f[k][a]].pb(f[k][b]);
	dfs(k,f[k][b],f[k][a]);
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>d>>n>>m,mi[0]=1;
	for(int i=1;i<=d;i++)mi[i]=mi[i-1]*mod;
	for(int i=1;i<=d;i++)for(int j=1;j<=n;j++)f[i][j]=j,hsh[j]+=mi[i]*j;
	ans=n;
	for(int i=1;i<=n;i++)mp[hsh[i]]=1;
	for(int a,b,k,i=1;i<=m;i++)cin>>a>>b>>k,l(k,a,b),cout<<ans<<'\n';
}
2025/1/22 12:19
加载中...