社区讨论
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 条回复,欢迎继续交流。
正在加载回复...