提交时间:2024-11-14 16:03:37

运行 ID: 34791

#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=3010,MAXM=9000010,Mod=998244353; int n,m,ans,cnt,fa[MAXN],siz[MAXN]; pii a[MAXN]; struct side{ int u,v,w; bool operator<(const side&G)const{ return w<G.w; } }s[MAXM]; int dis(pii x,pii y){return abs((x.fr-y.fr)*(x.fr-y.fr)*(x.fr-y.fr))+abs((x.sc-y.sc)*(x.sc-y.sc)*(x.sc-y.sc));} int fid(int x){return fa[x]==x?x:fa[x]=fid(fa[x]);} bool mrge(int u,int v){ int x=fid(u),y=fid(v); if(x!=y){ if(siz[x]>siz[y])swap(x,y); fa[x]=y; siz[y]+=siz[x]; return 1; } return 0; } void slv(){ n=read(),m=read(); for(int i=1;i<=n;i++)a[i].fr=read(),a[i].sc=read(),fa[i]=i,siz[i]=1; for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ s[++cnt].u=i,s[cnt].v=j,s[cnt].w=dis(a[i],a[j]); } } sort(s+1,s+cnt+1);int tmp=0; for(int i=1;i<=cnt;i++){ if(mrge(s[i].u,s[i].v))ans+=s[i].w,s[++tmp]=s[i]; } cnt=tmp; printf("%lld\n",ans); while(m--){ for(int i=1;i<=n;i++)fa[i]=i,siz[i]=1; int u=read(),v=read(),w=read(),l=-1,r=0;ans=0; for(int i=1;i<=cnt;i++)if(s[i].w<=w){ bool tmp=mrge(s[i].u,s[i].v); ans+=s[i].w; } else { if(l==-1){if(mrge(u,v))ans+=w,l=i;else l=0;} if(!mrge(s[i].u,s[i].v)){ r=i; } else ans+=s[i].w; } if(l>0){ for(int i=r;i>=l;i--)s[i]=s[i-1]; s[l]={u,v,w}; } printf("%lld\n",ans); } } signed main(){ slv(); return 0; }