提交时间:2024-11-14 14:33:15

运行 ID: 34754

#include<bits/stdc++.h> #define ll long long using namespace std; int n,q; ll x[3005],y[3005]; struct dsu{ int fa[3005],sz[3005]; inline void init(){ for(int i=1;i<=n;i++)fa[i]=i,sz[i]=1; } inline int fr(int p){ // cout<<p<<" "; return fa[p]==p?p:(fa[p]=fr(fa[p])); } inline void mg(int x,int y){ // cout<<x<<" "<<y<<endl; x=fr(x),y=fr(y); if(x==y)return; if(sz[x]>sz[y])swap(x,y); fa[x]=y; sz[y]+=sz[x]; } }D; struct edge{ int u,v; ll w; }; inline bool operator<(edge a,edge b){ return a.w<b.w; } edge e_[4500005]; int tot; vector<int>e[100005]; ll vl[100005]; inline ll calc(int a,int b){ return abs(x[a]-x[b])*(x[a]-x[b])*(x[a]-x[b])+abs(y[a]-y[b])*(y[a]-y[b])*(y[a]-y[b]); } int fa[100005]; void dfs(int p){ for(int x:e[p]){ if(x==fa[p])continue; fa[x]=p; dfs(x); } } template<typename T> inline void read(T &x){ x=0; bool f=0; char c=getchar(); while(!isdigit(c)){if(c=='-')f=1;c=getchar();} while(isdigit(c))x=x*10+c-'0',c=getchar(); if(f)x=-x; } signed main(){ read(n),read(q); for(int i=1;i<=n;i++)read(x[i]),read(y[i]); for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ e_[++tot]={i,j,calc(i,j)}; } } sort(e_+1,e_+1+tot); ll ans=0; D.init(); int tot=n; for(int i=1;i<=tot;i++){ auto x=e_[i]; if(D.fr(x.u)!=D.fr(x.v)){ D.mg(x.u,x.v); vl[++tot]=x.w; e[x.u].push_back(tot); e[x.v].push_back(tot); e[tot].push_back(x.u); e[tot].push_back(x.v); ans+=x.w; } } printf("%lld\n",ans); // e_.resize(0); // cout<<e_.capacity()*sizeof(int)/1024/1024<<endl; while(q--){ int u,v; ll w; cin>>u>>v>>w; fa[u]=0; dfs(u); int mx=0; int cur=v; while(cur!=u){ if(!mx||vl[cur]>vl[mx])mx=cur; cur=fa[cur]; } if(vl[mx]<=w){ printf("%lld\n",ans); continue; } ans-=vl[mx]-w; printf("%lld\n",ans); while(e[mx].size()){ auto it=e[mx].begin(); e[*it].erase(find(e[*it].begin(),e[*it].end(),mx)); e[mx].erase(it); } e[u].push_back(++tot); e[v].push_back(tot); e[tot].push_back(u); e[tot].push_back(v); vl[tot]=w; } return 0; }