求助,非常感谢!
查看原帖
求助,非常感谢!
429102
cflsfzh楼主2024/11/9 10:57

rt

我的代码MLE了,好像是vector的问题,希望有大佬能帮忙看下,怎么改。

非常感谢您的帮助!

贴上代码。

请注意:我的ans统计是错误的,请不要提出与我的需求无关的问题。谢谢!

#include<bits/stdc++.h>
//#define int long long
#define ll long long
#define re register
#define pb push_back
using namespace std;
int read()
{
	int x=0;
	int f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')
			f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
const int N=1e6+6;
struct edge{
	int v,next,w;
};
edge e[2*N];
//struct qwq_{
//	int v,next,w;
//};
//qwq_ qwq[2*N];
const int n=read();
//int awa;
ll awa;
int k_,head[N];
int top,cnt[N];
int qwq[N];
int b[N];
queue<int> k;
int bb[2*N];
vector<int> mp[N];
//vector<int> mp_[N];
//int lm[N];
int kc;
//int ans[N];
int flag[N];
void add(int u,int v,int w)
{
	e[++k_].v=v;
	e[k_].w=w;
	e[k_].next=head[u];
	head[u]=k_;
	return;
}
void dfs(int u)
{
	b[u]=kc;
	bb[kc]++;
//	mp[kc].pb(u);
	for(re int i=head[u];i;i=e[i].next){
		re int v=e[i].v;
		if(b[v])
			continue;
		dfs(v);
	}
	return;
}
void topu(int x)
{
	queue<int> q;
	while(!q.empty())
		q.pop();
	for(auto xx:mp[x])
		if(cnt[xx]<2)
			q.push(xx);
	while(!q.empty()){
		re int u=q.front();
		q.pop();
		for(re int i=head[u];i;i=e[i].next){
			re int v=e[i].v;
			cnt[v]--;
			if(cnt[v]<2)
				q.push(v);
		}
	}
	re int t=0;
	vector<int> mp_(mp[x]);
	mp[x].clear();
//	mp_.clear();
//	mp_.swap(mp[x]);
//	vector<int>().swap(mp[x]);
	std::vector<int>::iterator it=mp_.begin();
	for(;it!=mp_.end();it++)
		if(cnt[*it]==2){
			b[*it]=1;
			t=*it;
			flag[*it]=x;
//			mp_->pb(xx);
			mp[x].pb(*it);
//			printf("%d------\n",mp[x].capacity());
		}
//	mp[x].swap(*mp_);
//	swap(mp[x],mp_);
//	mp_->swap(mp[x]);
//	swap(mp[x],*mp_);
//	delete(mp_);
	re int v=t,u=0,fa=0;
	while(v!=t||!u){
		fa=u;
		u=v;
		for(re int i=head[u];i;i=e[i].next){
			re int vv=e[i].v;
			if(vv==fa)
				continue;
			if(!b[vv])
				continue;
			if(bb[i])
				continue;
//			ans[x]+=e[i].w;
			awa+=e[i].w;
			bb[(u<vv?i+1:i-1)]=bb[i]=1;
			v=vv;
			break;
		}
	}
	return;
}
int dfs_(int u,int fa,int x)
{
	re int mx=0;
	for(re int i=head[u];i;i=e[i].next){
		re int v=e[i].v;
		if(b[v]!=-1)
			continue;
		mx=max(mx,e[i].w+dfs_(v,u,x));
//		dfs_(v,u,x);
	}
	return mx;
}
void get_ans()
{
	for(re int i=1;i<=n;i++)
		if(b[i]!=-1)
			b[i]+=dfs_(i,0,i);
	return;
}
signed main()
{
//	n=read();
	for(re int i=1;i<=n;i++){
		re int v,w;
		v=read();
		w=read();
		re int ii=i;
		re int vv=v;
		if(ii>vv)
			swap(ii,vv);
		add(ii,vv,w);
		add(vv,ii,w);
		cnt[i]++;
		cnt[v]++;
		qwq[i]++;
		qwq[v]++;
	}
	for(re int i=1;i<=n;i++)
		if(!b[i]){
			k.push(i);
			kc++;
			dfs(i);
		}
	for(re int i=1;i<=kc;i++){
		mp[i].reserve(bb[i]);
		bb[i]=0;
	}
//	cout<<1;
	for(int i=kc+1;i<N;i++)
		vector<int>().swap(mp[i]);
//		mp_[i].reserve(lm[i]+1);
//	}
//	cout<<2;
	for(re int i=1;i<=n;i++)
		mp[b[i]].push_back(i);
	memset(b,0,sizeof(b));
//	cout<<1;
	for(re int i=1;i<=kc;i++)
		topu(i);
	for(re int i=1;i<=n;i++)
		if(b[i])
			b[i]=0;
		else
			b[i]=-1;
	get_ans();
//	printf("%lld\n",awa);
	for(re int i=1;i<=kc;i++){
		ll mx=0;
		for(auto x:mp[i]){
			for(re int j=head[x];j;j=e[j].next)
				if(b[e[j].v]!=-1)
					mx=max(mx,1ll*b[x]+b[e[j].v]-e[j].w);
//			mx=max(mx,1ll*b[x]);
		}
		vector<int>().swap(mp[i]);
//		printf("%lld********\n",mx);
		awa+=mx;
	}
//	printf("%lld---\n",kc);
//	for(int i=1;i<=kc;i++){
//		printf("%lld*****\n",i);
//		for(auto x:mp_[i])
//			printf("%lld ",x);
//		printf("\n-------\n");
//	}
//	cout<<1;
//	for(int i=1;i<=kc;i++)
//		printf("%lld---%lld---\n",i,ans[i]);
//	for(int i=1;i<=kc;i++){ 
//		printf("%lld*******\n",i);
//		for(auto x:mp[i])
//			printf("%lld ",b[x]);
//		printf("\n----------\n");
//	}
	printf("%lld\n",awa);
	return 0;
}
2024/11/9 10:57
加载中...