如题,感觉时间复杂度是对的,也尝试改了许多地方,但是死活只有50分,求帮忙看一下,十分感谢
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,q,ans[50010];
struct edge {
int s,e,w;
} ed[50100];
struct ques {
int num,w;
} qu[50100];
int fa[20010],sz[20010],top,st[50100];
int vis[50100];
int find(int a) {
return (a==fa[a]?a:find(fa[a]));
}
void add(int s,int f) {
if(sz[s]>sz[f])swap(s,f);
fa[s]=f;
sz[f]+=sz[s];
st[++top]=s;
}
void del(int pos,int now) {
sz[now]-=sz[pos];
return;
}
void back(int tim) {
while(top>tim) {
del(st[top],fa[st[top]]);
fa[st[top]]=st[top];
top--;
}
}
unordered_map<int,int> mp;
void uni(int l,int r,vector<int> &a,vector<int> &b,vector<int> &xa,vector<int> &xb) {
mp.clear();
for(int i=l; i<=r; i++) {
mp[qu[i].num]=1;
}
for(int i=0; i<b.size(); i++) {
if(mp[b[i]]) {
xb.push_back(b[i]);
} else {
xa.push_back(b[i]);
}
}
for(int i=0; i<a.size(); i++) {
xa.push_back(a[i]);
}
}
bool cmp1(int a,int b) {
return ed[a].w<ed[b].w;
}
void krus(vector<int> &a,vector<int> &b,int &sum,int flag) {
int tmp=top;
vector<int> chan;
if(flag==1) {
vector<int> c;
for(int i=0; i<b.size(); i++) {
int f1=find(ed[b[i]].s),f2=find(ed[b[i]].e);
if(f1!=f2)add(f1,f2);
}
for(int i=0; i<a.size(); i++) {
int f1=find(ed[a[i]].s),f2=find(ed[a[i]].e);
if(f1!=f2) {
sum+=ed[a[i]].w;
add(f1,f2);
c.push_back(a[i]);
continue;
}
chan.push_back(a[i]);
}
back(tmp);
for(int i=0; i<c.size(); i++) {
int f1=find(ed[c[i]].s),f2=find(ed[c[i]].e);
add(f1,f2);
}
int e=0;
} else {
for(int i=0; i<a.size(); i++) {
int f1=find(ed[a[i]].s),f2=find(ed[a[i]].e);
if(f1!=f2) {
add(f1,f2);
chan.push_back(a[i]);
}
}
back(tmp);
}
swap(chan,a);
}
void solve(int l,int r,vector<int> &a,vector<int> &b,int tim,int sum) {
if(l==r) {
a.push_back(qu[l].num);
ed[qu[l].num].w=qu[l].w;
b.clear();
sort(a.begin(),a.end(),cmp1);
krus(a,b,sum,1);
ans[l]=sum;
back(tim);
return;
}
sort(a.begin(),a.end(),cmp1);
krus(a,b,sum,1);
krus(a,b,sum,2);
tim=top;
int mid=(l+r)>>1;
vector<int> la,lb,ra,rb;
uni(l,mid,a,b,la,lb);
solve(l,mid,la,lb,tim,sum);
back(tim);
uni(mid+1,r,a,b,ra,rb);
solve(mid+1,r,ra,rb,tim,sum);
return;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
vector<int> a,b;
cin>>n>>m>>q;
for(int i=1; i<=m; i++) {
cin>>ed[i].s>>ed[i].e>>ed[i].w;
}
for(int i=1; i<=q; i++) {
cin>>qu[i].num>>qu[i].w;
vis[qu[i].num]=1;
}
for(int i=1; i<=m; i++) {
vis[i]?b.push_back(i):a.push_back(i);
}
for(int i=1; i<=n; i++) {
fa[i]=i;
}
solve(1,q,a,b,0,0);
for(int i=1; i<=q; i++) {
cout<<ans[i]<<endl;
}
}