GoldenPotato137 @ 2019-03-05 10:26:56
RT,这题我本地跑是没有问题的,但是交到OJ上就会玄学RE。LOJ上可以看出我的程序是输出之后才因为RE被kill的,问题是我输出之后就直接return0了。还请各位dalao帮忙看看我是哪里写爆了。
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
long long read()
{
long long x=0,f=1; char c=getchar();
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
struct road
{
int to,w,rev;
road(int x,int y,int z)
{
to=x,w=y,rev=z;
}
};
const int N=500*4+10;
const int S=0,T=1999;
const int inf=0x3f3f3f3f;
vector <road> e[N];
int depth[N];
bool bfs()
{
static int mqueue[N],front,tail,vis[N];
memset(vis,0,sizeof vis);
front=tail=0;
mqueue[tail++]=S,vis[S]=1;
while(front<tail)
{
int now=mqueue[front++];
for(int i=0;i<int(e[now].size());i++)
if(vis[e[now][i].to]==false and e[now][i].w>0)
{
vis[e[now][i].to]=true;
depth[e[now][i].to]=depth[now]+1;
mqueue[tail++]=e[now][i].to;
}
}
return vis[T];
}
int last[N];
int dfs(int now,int w)
{
if(now==T) return w;
int t_ans=0;
for(int i=last[now];i<int(e[now].size());i++,last[now]++)
if(depth[e[now][i].to]==depth[now]+1 and e[now][i].w>0)
{
int tmp=dfs(e[now][i].to,min(e[now][i].w,w));
t_ans+=tmp,w-=tmp;
e[now][i].w-=tmp,e[e[now][i].to][e[now][i].rev].w+=tmp;
if(w==0) break;
}
return t_ans;
}
int Dinic()
{
int t_ans=0;
while(bfs()==true)
{
memset(last,0,sizeof last);
t_ans+=dfs(S,inf);
}
return t_ans;
}
void AddLine(int s,int t,int w)
{
e[s].push_back(road(t,w,e[s].size()));
e[t].push_back(road(s,0,e[t].size()-1));
}
int n,a[N],f[N];
int main()
{
n=read();
for(int i=1;i<=n;i++)
a[i]=read();
int ans=0;
for(int i=1;i<=n;i++)
{
f[i]=1;
for(int j=1;j<i;j++)
if(a[i]>=a[j])
f[i]=max(f[i],f[j]+1);
ans=max(ans,f[i]);
}
printf("%d\n",ans);
if(n==1)
{
printf("1\n1");
return 0;
}
for(int o=1;o<=2;o++)
{
for(int i=1;i<=2*n;i++)
e[i].clear();
for(int i=1;i<=2*n;i++)
e[i].reserve(4);
for(int i=1;i<=n;i++)
{
if((i==n or i==1) and o==2)
AddLine(i,n+i,inf);
else
AddLine(i,n+i,1);
}
if(o==2 and f[1]==1)
AddLine(S,1,inf);
if(o==2 and f[n]==ans)
AddLine(n+n,T,inf);
for(int i=1;i<=n;i++)
{
if(f[i]==1)
AddLine(S,i,1);
if(f[i]==ans)
AddLine(n+i,T,1);
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(a[j]>=a[i] and f[j]==f[i]+1)
AddLine(n+i,j,1);
printf("%d\n",Dinic());
}
return 0;
}
by ニヒル @ 2019-03-05 10:41:17
@GoldenPotato137 orz刚开电脑就会写网络流qwq
by 142857cs @ 2019-03-05 10:41:27
去你的萌新
by GoldenPotato137 @ 2019-03-05 10:44:16
@ニヒル 不要在意那些细节w
by ニヒル @ 2019-03-05 10:45:25
@GoldenPotato137 表示这辈子第一次见到这种报错……
by GoldenPotato137 @ 2019-03-05 11:03:17
非常感谢各位dalao了,在神仙网友帮助下,我发现我反边建爆了qwq
by Soulist @ 2019-03-05 11:47:04
萌新都是怪物系列
by Bean233 @ 2019-03-05 11:48:37
怪物萌新,题号?