我是萌新,刚学开电脑,这题玄学RE,求各位神仙帮忙

P2766 最长不下降子序列问题

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

怪物萌新,题号?


|