社区讨论

MLE的绝望

P3627[APIO2009] 抢掠计划参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi6xbi8g
此快照首次捕获于
2025/11/20 12:20
4 个月前
此快照最后确认于
2025/11/20 12:20
4 个月前
查看原帖
第三点MLE。
空间真的没得缩了qwq~
大佬们又没有方法呀qwq~
CPP
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;

const int N=500005;
const int M=500005;

int n,m;
int s,p;
int w[N];
int head[N],nex[M],to[M],cc=0;
int heads[N],nexs[M],tos[M],ccs=0;
int dfn[N],low[N],scc[N],cnt,c;
int st[N],top;
int in[N],f[N];
bool bar[N];
queue<int>q;

void addedge(int a,int b){
    nex[++cc]=head[a];
    head[a]=cc;
    to[cc]=b;
}

void addedges(int a,int b){
    nexs[++ccs]=heads[a];
    heads[a]=ccs;
    tos[ccs]=b;
}

void qwq(int u){
    dfn[u]=low[u]=++c;
    st[++top]=u;
    
    int i;
    for(i=head[u];i;i=nex[i]){
        if(!dfn[to[i]]){
            qwq(to[i]);
            low[u]=min(low[u],low[to[i]]);
        }else if(!scc[to[i]])low[u]=min(low[u],dfn[to[i]]);
    }
    
    if(dfn[u]==low[u]){
        //cout<<u<<':'<<endl;
        cnt++;
        for(i=st[top];i!=u;i=st[--top])scc[i]=cnt;
        scc[u]=cnt,top--;
        //cout<<endl;
    }
}

int main(){
    int i,j,k;
    int a,b;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        scanf("%d%d",&a,&b);
        addedge(a,b);
    }
    
    memset(dfn,0,sizeof(dfn)),memset(scc,0,sizeof(scc)),top=cnt=0;
    c=0;
    for(i=1;i<=n;i++)if(!dfn[i])qwq(i);
    bool flag;
    memset(in,0,sizeof(in));
    for(i=1;i<=n;i++){
        for(j=head[i];j;j=nex[j]){
            if(scc[i]!=scc[to[j]]){
                flag=0;
                for(k=heads[scc[i]];k;k=nexs[k]){
                    if(tos[k]==scc[to[j]]){
                        flag=1;
                        break;
                    }
                }
                if(!flag)addedges(scc[i],scc[to[j]]),in[scc[to[j]]]++;
            }
        }
    }
    
    memset(w,0,sizeof(w));
    for(i=1;i<=n;i++){
        scanf("%d",&a);
        w[scc[i]]+=a;
    }
    
    scanf("%d%d",&s,&p);
    s=scc[s];
    memset(bar,0,sizeof(bar));
    for(i=1;i<=p;i++){
        scanf("%d",&a);
        bar[scc[a]]=1;
    }
    
    memset(f,0,sizeof(f));
    f[s]=w[s],q.push(s);
    
    bool v[N];
    int u;
    memset(v,0,sizeof(v));
    v[s]=1;
    while(!q.empty()){
        u=q.front(),q.pop();
        for(i=heads[u];i;i=nexs[i]){
            v[tos[i]]=1;
            q.push(tos[i]);
        }
    }
    
    for(i=1;i<=cnt;i++)if(!v[i]){
        for(j=heads[i];j;j=nexs[j]){
            in[tos[j]]--;
        }
    }
    
    q.push(s);
    while(!q.empty()){
        u=q.front(),q.pop();
        for(i=heads[u];i;i=nexs[i]){
            v[tos[i]]=1;
            f[tos[i]]=max(f[tos[i]],f[u]+w[tos[i]]);
            in[tos[i]]--;
            if(in[tos[i]]==0)q.push(tos[i]);
        }
    }
    
    int ans=0;
    for(i=1;i<=cnt;i++)if(bar[i]&&v[i])ans=max(ans,f[i]);
    
    printf("%d\n",ans);
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...