这个复杂度我自己觉得是 O(nlog2n) 的,但是咋都只能五十分。
有没有大佬帮忙看下是复杂度假了还是单纯常数大啊qwq
评测链接:https://www.luogu.com.cn/record/142444187
#include <bits/stdc++.h>
//#define int long long
#define double long double
#define endl "\n"
#define pii pair<double,int>
#define p1(x) ((x).first)
#define p2(x) ((x).second)
#define lc(x) ((x)<<1)
#define rc(x) ((x)<<1|1)
#define len(x) T[x].len
#define sum(x) T[x].sum
#define pre(x) T[x].pre
#define suf(x) T[x].suf
#define mx(x) T[x].mx
#define i128 __int128_t
using namespace std;
struct edge{
int u,v,w;
};
vector<edge>E[50030<<2],G[50030<<2];
int f[20030],siz[20030];
stack<int>LST;
inline int ff(int x){
return f[x]==x?x:ff(f[x]);
}
inline bool merge(int x,int y){
x=ff(x),y=ff(y);
if(x==y)return 0;
if(siz[x]<siz[y])swap(x,y);
f[y]=x;
siz[x]+=siz[y];
LST.push(y);
return 1;
}
inline void rvk(){
int x=LST.top();
LST.pop();
siz[f[x]]-=siz[x];
f[x]=x;
}
inline bool cmp(edge A,edge B){
return A.w<B.w;
}
inline vector<edge> KR(vector<edge>E){
vector<edge>RES;
int cnt=0;
sort(E.begin(),E.end(),cmp);
for(auto e:E){
if(merge(e.u,e.v))
cnt++,RES.push_back(e);
}
while(cnt--)rvk();
return RES;
}
const int INF=1e11;
inline void calc(int x,int l,int r,vector<edge>P,long long s){
for(edge e:E[x])
P.push_back(e);
if(l==r){
auto T=KR(P);
for(auto e:T)
s+=e.w;
cout<<s<<endl;
return ;
}
vector<edge>SP=P;
for(edge e:G[x])
SP.push_back({e.u,e.v,-INF});
vector<edge>R=KR(SP);
int cnt=0;
SP.clear();
int cw=0;
for(edge e:R)
if(e.w!=-INF)
cnt+=merge(e.u,e.v),s+=e.w;
for(edge e:P)
if(ff(e.u)!=ff(e.v))
SP.push_back(e);
for(edge e:G[x])
SP.push_back({e.u,e.v,INF});
R=KR(SP);
vector<edge>N;
for(edge e:R)
if(e.w!=INF)N.push_back(e);
int mid=l+r>>1;
calc(lc(x),l,mid,N,s);
calc(rc(x),mid+1,r,N,s);
while(cnt--)rvk();
}
int lst[50300];
edge ae[50300];
inline void mod(int x,int l,int r,int L,int R,edge e){
if(L>R)return ;
// if(x==1){
// cout<<L<<"x"<<R<<" "<<e.u<<" "<<e.v<<" "<<e.w<<endl;
// }
if(L<=l&&r<=R){
E[x].push_back(e);
return ;
}
G[x].push_back(e);
int mid=l+r>>1;
if(L<=mid)mod(lc(x),l,mid,L,R,e);
if(R>mid)mod(rc(x),mid+1,r,L,R,e);
}
int n,m,q;
signed main(){
ios::sync_with_stdio(0);
// freopen("P2483_3.in","r",stdin);
// freopen("b.out","w",stdout);
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
cin>>ae[i].u>>ae[i].v>>ae[i].w;
for(int i=1;i<=q;i++){
int k,d;
cin>>k>>d;
mod(1,1,q,lst[k]+1,i-1,ae[k]);
ae[k].w=d;
lst[k]=i-1;
}
for(int i=1;i<=m;i++)
mod(1,1,q,lst[i]+1,q,ae[i]);
calc(1,1,q,{},0);
cout.flush();
return 0;
}
/*
*/