数组改成 vector 后 AC 了?
  • 板块学术版
  • 楼主__vector__
  • 当前回复9
  • 已保存回复9
  • 发布时间2025/8/31 20:47
  • 上次更新2025/9/1 00:07:08
查看原帖
数组改成 vector 后 AC 了?
507348
__vector__楼主2025/8/31 20:47

我写了一道题,在这

我提交得到了 RE,错误信息:
-1073741571 (STATUS_STACK_OVERFLOW)

然后,我将第 134 行的变长数组换成了 vector,就 AC 了。

RE 提交

AC 提交

我用了好几年变长数组了,都没有出现这个问题,感觉非常的离谱。。。。

求大佬们分析原因。

如果您无法打开提交记录,下面放上代码:
::::info[RE 提交]

#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(auto i=(a);i<=(b);i++)
#define REP(i,a,b) for(auto i=(a);i>=(b);i--)
#define FORK(i,a,b,k) for(auto i=(a);i<=(b);i+=(k))
#define REPK(i,a,b,k) for(auto i=(a);i>=(b);i-=(k))
#define pb push_back
#define mkpr make_pair
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
template<class T>
void ckmx(T& a,T b){
    a=max(a,b);
}
template<class T>
void ckmn(T& a,T b){
    a=min(a,b);
}
template<class T>
T gcd(T a,T b){
    return !b?a:gcd(b,a%b);
}
template<class T>
T lcm(T a,T b){
    return a/gcd(a,b)*b;
}
#define gc getchar()
#define eb emplace_back
#define pc putchar
#define ep empty()
#define fi first
#define se second
#define pln pc('\n');
#define islower(ch) (ch>='a'&&ch<='z')
#define isupper(ch) (ch>='A'&&ch<='Z')
#define isalpha(ch) (islower(ch)||isupper(ch))
template<class T>
void wrint(T x){
    if(x<0){
        x=-x;
        pc('-');
    }
    if(x>=10){
        wrint(x/10);
    }
    pc(x%10^48);
}
template<class T>
void wrintln(T x){
    wrint(x);
    pln
}
template<class T>
void read(T& x){
    x=0;
    int f=1;
    char ch=gc;
    while(!isdigit(ch)){
        if(ch=='-')f=-1;
        ch=gc;
    }
    while(isdigit(ch)){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=gc;
    }
    x*=f;
}
void ioopti(){
    ios::sync_with_stdio(0);
    cin.tie(0);
}
const int maxn=5e5+5;
int n,k;
bool tag[maxn];
vector<pair<int,ll> > g[maxn];
struct INFO{
    bool no=1;
    ll fir=0,las=0;
    ll gcd;// 差分的 gcd。
};
INFO merge(INFO a,INFO b){
    INFO res;
    if(a.no)res=b;
    if(b.no)res=a;
    if(a.no||b.no)return res;
    res.fir=a.fir;
    res.las=b.las;
    res.gcd=gcd(gcd(a.gcd,b.gcd),abs(b.fir-a.las));
    res.no=0;
    return res;
}
INFO add(INFO a,ll x){
    INFO res=a;
    res.fir+=x;
    res.las+=x;
    return res;
}
int siz[maxn];
INFO dw[maxn],up[maxn];
void dfs1(int u,int _fa){
    siz[u]=1;
    for(auto [v,w]:g[u]){
        if(v==_fa)continue;
        dfs1(v,u);
        siz[u]+=siz[v];
        auto tmp=add(dw[v],w);
     //   printf("dw[%d] : fir %lld las %lld gcd %lld\n",v,tmp.fir,tmp.las,tmp.gcd);
        dw[u]=merge(dw[u],tmp);
     //   printf("merged %d : %lld %lld %lld\n",u,dw[u].fir,dw[u].las,dw[u].gcd);
    }
    if(tag[u]){
        INFO tmp;
        tmp.fir=tmp.las=tmp.gcd=tmp.no=0;
        dw[u]=merge(dw[u],tmp);
    }
 //   printf("dw[%d].gcd = %lld\n",u,dw[u].gcd);
}
ll allgcd[maxn];
void dfs2(int u,int _fa){
  //  printf("up[%d].gcd = %lld no = %d\n",u,up[u].gcd,int(up[u].no));
    {
        auto tmp=merge(dw[u],up[u]);
        allgcd[u]=gcd(tmp.fir,tmp.gcd);
    }
    
    vector<pair<int,ll> > sons;
    for(auto [v,w]:g[u]){
        if(v==_fa)continue;
        sons.eb(mkpr(v,w));
    }
    if(sons.empty())return;
    INFO pre[sons.size()+2],suf[sons.size()+2];
    pre[0]=add(dw[sons[0].fi],sons[0].se);
    FOR(i,1,sons.size()-1){
        pre[i]=merge(pre[i-1],add(dw[sons[i].fi],sons[i].se));
    }
    suf[sons.size()-1]=add(dw[sons.back().fi],sons.back().se);
    REP(i,sons.size()-1,1){
        suf[i-1]=merge(add(dw[sons[i-1].fi],sons[i-1].se),suf[i]);
    }
    FOR(i,0,sons.size()-1){
        INFO res;
        if(i>0)res=pre[i-1];
        if(i+1<sons.size())res=merge(res,suf[i+1]);
        res=merge(res,up[u]);
        res=add(res,sons[i].se);
        if(tag[u]){
            INFO tmp;
            tmp.no=0;
            tmp.fir=tmp.las=sons[i].se;
            tmp.gcd=0;
            res=merge(res,tmp);
        }
        up[sons[i].fi]=res;
        dfs2(sons[i].fi,u);
    }
}
ll dwdis[maxn],updis[maxn];
int cnt[maxn];// 子树内部的关键点数量
void dfs3(int u,int _fa){
    for(auto [v,w]:g[u]){
        if(v==_fa)continue;
        dfs3(v,u);
        dwdis[u]+=dwdis[v]+cnt[v]*w;
        cnt[u]+=cnt[v];
    }
    cnt[u]+=tag[u];
}
ll alldis[maxn];
void dfs4(int u,int _fa){
    alldis[u]=dwdis[u]+updis[u];
    ll s=updis[u];
    for(auto [v,w]:g[u]){
        if(v==_fa)continue;
        s+=dwdis[v]+cnt[v]*w;
    }
    for(auto [v,w]:g[u]){
        if(v==_fa)continue;
        updis[v]=(s-dwdis[v]-cnt[v]*w)+w*(k-cnt[v]);
        dfs4(v,u);
    }
}
void solve(int id_of_test){
	read(n);
    read(k);
    if(k==1){
        puts("0");
        return;
    }
    FOR(i,1,k){
        int c;
        read(c);
        tag[c]=1;
    }
    FOR(i,1,n-1){
        int u,v;
        ll w;
        read(u);
        read(v);
        read(w);
        g[u].eb(mkpr(v,w));
        g[v].eb(mkpr(u,w));
    }
    dfs1(1,0);
    dfs2(1,0);
    dfs3(1,0);
    dfs4(1,0);
    ll ans=1e18;
    FOR(i,1,n){
        ckmn(ans,alldis[i]/allgcd[i]);
    }
    printf("%lld\n",ans*2);
}
int main()
{
	int T;
	T=1;
	FOR(_,1,T){
		solve(_);
	}
	return 0;
}
/*
1. 对题意的理解能否和样例对的上?  
2. 每一步操作,能否和自己的想法对应上?  
3. 每一步操作的正确性是否有保证?  
4. 是否考虑到了所有的 case?特别是极限数据。
5. 变量的数据类型是否与其值域匹配?
6. 时间复杂度有保证吗?
7. 空间多少 MB?  
*/

::::
::::info[AC 提交]

#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(auto i=(a);i<=(b);i++)
#define REP(i,a,b) for(auto i=(a);i>=(b);i--)
#define FORK(i,a,b,k) for(auto i=(a);i<=(b);i+=(k))
#define REPK(i,a,b,k) for(auto i=(a);i>=(b);i-=(k))
#define pb push_back
#define mkpr make_pair
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
template<class T>
void ckmx(T& a,T b){
    a=max(a,b);
}
template<class T>
void ckmn(T& a,T b){
    a=min(a,b);
}
template<class T>
T gcd(T a,T b){
    return !b?a:gcd(b,a%b);
}
template<class T>
T lcm(T a,T b){
    return a/gcd(a,b)*b;
}
#define gc getchar()
#define eb emplace_back
#define pc putchar
#define ep empty()
#define fi first
#define se second
#define pln pc('\n');
#define islower(ch) (ch>='a'&&ch<='z')
#define isupper(ch) (ch>='A'&&ch<='Z')
#define isalpha(ch) (islower(ch)||isupper(ch))
template<class T>
void wrint(T x){
    if(x<0){
        x=-x;
        pc('-');
    }
    if(x>=10){
        wrint(x/10);
    }
    pc(x%10^48);
}
template<class T>
void wrintln(T x){
    wrint(x);
    pln
}
template<class T>
void read(T& x){
    x=0;
    int f=1;
    char ch=gc;
    while(!isdigit(ch)){
        if(ch=='-')f=-1;
        ch=gc;
    }
    while(isdigit(ch)){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=gc;
    }
    x*=f;
}
void ioopti(){
    ios::sync_with_stdio(0);
    cin.tie(0);
}
const int maxn=5e5+5;
int n,k;
bool tag[maxn];
vector<pair<int,ll> > g[maxn];
struct INFO{
    bool no=1;
    ll fir=0,las=0;
    ll gcd;// 差分的 gcd。
};
INFO merge(INFO a,INFO b){
    INFO res;
    if(a.no)res=b;
    if(b.no)res=a;
    if(a.no||b.no)return res;
    res.fir=a.fir;
    res.las=b.las;
    res.gcd=gcd(gcd(a.gcd,b.gcd),abs(b.fir-a.las));
    res.no=0;
    return res;
}
INFO add(INFO a,ll x){
    INFO res=a;
    res.fir+=x;
    res.las+=x;
    return res;
}
int siz[maxn];
INFO dw[maxn],up[maxn];
void dfs1(int u,int _fa){
    siz[u]=1;
    for(auto [v,w]:g[u]){
        if(v==_fa)continue;
        dfs1(v,u);
        siz[u]+=siz[v];
        auto tmp=add(dw[v],w);
     //   printf("dw[%d] : fir %lld las %lld gcd %lld\n",v,tmp.fir,tmp.las,tmp.gcd);
        dw[u]=merge(dw[u],tmp);
     //   printf("merged %d : %lld %lld %lld\n",u,dw[u].fir,dw[u].las,dw[u].gcd);
    }
    if(tag[u]){
        INFO tmp;
        tmp.fir=tmp.las=tmp.gcd=tmp.no=0;
        dw[u]=merge(dw[u],tmp);
    }
 //   printf("dw[%d].gcd = %lld\n",u,dw[u].gcd);
}
ll allgcd[maxn];
void dfs2(int u,int _fa){
  //  printf("up[%d].gcd = %lld no = %d\n",u,up[u].gcd,int(up[u].no));
    {
        auto tmp=merge(dw[u],up[u]);
        allgcd[u]=gcd(tmp.fir,tmp.gcd);
    }
    
    vector<pair<int,ll> > sons;
    for(auto [v,w]:g[u]){
        if(v==_fa)continue;
        sons.eb(mkpr(v,w));
    }
    if(sons.empty())return;
    vector<INFO> pre(sons.size()+2),suf(sons.size()+2);
    pre[0]=add(dw[sons[0].fi],sons[0].se);
    FOR(i,1,sons.size()-1){
        pre[i]=merge(pre[i-1],add(dw[sons[i].fi],sons[i].se));
    }
    suf[sons.size()-1]=add(dw[sons.back().fi],sons.back().se);
    REP(i,sons.size()-1,1){
        suf[i-1]=merge(add(dw[sons[i-1].fi],sons[i-1].se),suf[i]);
    }
    FOR(i,0,sons.size()-1){
        INFO res;
        if(i>0)res=pre[i-1];
        if(i+1<sons.size())res=merge(res,suf[i+1]);
        res=merge(res,up[u]);
        res=add(res,sons[i].se);
        if(tag[u]){
            INFO tmp;
            tmp.no=0;
            tmp.fir=tmp.las=sons[i].se;
            tmp.gcd=0;
            res=merge(res,tmp);
        }
        up[sons[i].fi]=res;
        dfs2(sons[i].fi,u);
    }
}
ll dwdis[maxn],updis[maxn];
int cnt[maxn];// 子树内部的关键点数量
void dfs3(int u,int _fa){
    for(auto [v,w]:g[u]){
        if(v==_fa)continue;
        dfs3(v,u);
        dwdis[u]+=dwdis[v]+cnt[v]*w;
        cnt[u]+=cnt[v];
    }
    cnt[u]+=tag[u];
}
ll alldis[maxn];
void dfs4(int u,int _fa){
    alldis[u]=dwdis[u]+updis[u];
    ll s=updis[u];
    for(auto [v,w]:g[u]){
        if(v==_fa)continue;
        s+=dwdis[v]+cnt[v]*w;
    }
    for(auto [v,w]:g[u]){
        if(v==_fa)continue;
        updis[v]=(s-dwdis[v]-cnt[v]*w)+w*(k-cnt[v]);
        dfs4(v,u);
    }
}
void solve(int id_of_test){
	read(n);
    read(k);
    if(k==1){
        puts("0");
        return;
    }
    FOR(i,1,k){
        int c;
        read(c);
        tag[c]=1;
    }
    FOR(i,1,n-1){
        int u,v;
        ll w;
        read(u);
        read(v);
        read(w);
        g[u].eb(mkpr(v,w));
        g[v].eb(mkpr(u,w));
    }
    dfs1(1,0);
    dfs2(1,0);
    dfs3(1,0);
    dfs4(1,0);
    ll ans=1e18;
    FOR(i,1,n){
        ckmn(ans,alldis[i]/allgcd[i]);
    }
    printf("%lld\n",ans*2);
}
int main()
{
	int T;
	T=1;
	FOR(_,1,T){
		solve(_);
	}
	return 0;
}
/*
1. 对题意的理解能否和样例对的上?  
2. 每一步操作,能否和自己的想法对应上?  
3. 每一步操作的正确性是否有保证?  
4. 是否考虑到了所有的 case?特别是极限数据。
5. 变量的数据类型是否与其值域匹配?
6. 时间复杂度有保证吗?
7. 空间多少 MB?  
*/

::::

2025/8/31 20:47
加载中...