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;
}