性感代码,在线求调
查看原帖
性感代码,在线求调
1307816
asdasd1297楼主2024/12/18 13:12

如题,感觉时间复杂度是对的,也尝试改了许多地方,但是死活只有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;
	}
}
2024/12/18 13:12
加载中...