求救!!!!

P2766 最长不下降子序列问题

da32s1da @ 2018-03-31 11:00:45

样例过,机子上跑没T,与题解拍了几个500的大数据也没T,luogu评测时发现进入mxflow()后就会TLE。

求大佬改正!!

#include<bits/stdc++.h>
#define INF 0x33333333
#define N 2000
using namespace std;
int n,mm;
struct edge{int to,cap,rev;};
vector<edge>g[N],G[N];
int level[N],iter[N];
int a[N],mx[N];
inline void rad(int &noi)
{
    bool mark=false;
    static char ch;
    while(ch=getchar(),ch<'0'||ch>'9') if(ch=='-') mark=true;
    noi=ch-'0';
    while(ch=getchar(),ch<='9'&&ch>='0') noi=(noi<<3)+(noi<<1)+ch-'0';
    if(mark) noi=-noi;
}
void add(int from,int to,int cap){
    g[from].push_back((edge){to,cap,g[to].size()});
    g[to].push_back((edge){from,0,g[from].size()-1});
}
void ADD(int from,int to,int cap){
    G[from].push_back((edge){to,cap,G[to].size()});
    G[to].push_back((edge){from,0,G[from].size()-1});
}
void bfs(int s){
    memset(level,-1,sizeof(level));
    queue<int>q;
    level[s]=0;
    q.push(s);
    while(!q.empty()){
        int r=q.front();q.pop();
        for(int i=0;i<g[r].size();i++){
            edge &p=g[r][i];
            if(p.cap>0&&level[p.to]<0){
                level[p.to]=level[r]+1;
                q.push(p.to);
            }
        }
    }
}
int dfs(int v,int t,int f){
    if(v==t) return f;
    for(int &i=iter[v];i<g[v].size();i++){
        edge &p=g[v][i];
        if(p.cap>0&&level[p.to]==level[v]+1){
            int d=dfs(p.to,t,min(f,p.cap));
            if(d>0){
                p.cap-=d;
                g[p.to][p.rev].cap+=d;
                return d;
            }
        }
    }
}
void mxflow(int s,int t){
    int flow=0;
    for(;;){
        bfs(s);
        if(level[t]<0) {cout<<flow<<endl;return;}
        memset(iter,0,sizeof(iter));
        int f;
        while((f=dfs(s,t,INF))>0)
        flow+=f;
    }
}
void BFS(int s){
    memset(level,-1,sizeof(level));
    queue<int>q;
    level[s]=0;
    q.push(s);
    while(!q.empty()){
        int r=q.front();q.pop();
        for(int i=0;i<G[r].size();i++){
            edge &p=G[r][i];
            if(p.cap>0&&level[p.to]<0){
                level[p.to]=level[r]+1;
                q.push(p.to);
            }
        }
    }
}
int DFS(int v,int t,int f){
    if(v==t) return f;
    for(int &i=iter[v];i<G[v].size();i++){
        edge &p=G[v][i];
        if(p.cap>0&&level[p.to]==level[v]+1){
            int d=DFS(p.to,t,min(f,p.cap));
            if(d>0){
                p.cap-=d;
                G[p.to][p.rev].cap+=d;
                return d;
            }
        }
    }
}
void MXFLOW(int s,int t){
    int flow=0;
    for(;;){
        BFS(s);
        if(level[t]<0) {cout<<flow<<endl;return;}
        memset(iter,0,sizeof(iter));
        int f;
        while((f=DFS(s,t,INF))>0)
        flow+=f;
    }
}
int main()
{
    cin>>n;int s=1,t=2*n+2;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
    for(int j=1;j<i;j++)
    if(a[i]>=a[j]) mx[i]=max(mx[i],mx[j]+1);
    for(int i=1;i<=n;i++)
    mx[i]++,mm=max(mm,mx[i]);
    cout<<mm<<endl;
    for(int i=1;i<=n;i++){
        if(mx[i]==1) add(s,i+1,1);
        if(mx[i]==mm) add(i+n+1,t,1);
        add(i+1,i+n+1,1);
        for(int j=1;j<i;j++)
        if(a[i]>=a[j]&&mx[i]==mx[j]+1)
        add(j+n+1,i+1,1);
    }
    mxflow(s,t);
    for(int i=1;i<=n;i++){
        if(mx[i]==1) ADD(s,i+1,1);
        if(mx[i]==mm) ADD(i+n+1,t,1);
        ADD(i+1,i+n+1,1);
        for(int j=1;j<i;j++)
        if(a[i]>=a[j]&&mx[i]==mx[j]+1)
        ADD(j+n+1,i+1,1);
    }
    ADD(s,2,INF);
    ADD(2,2+n,INF);
    if(mx[n]==mm) ADD(n+1,2*n+1,INF),ADD(n*2+1,t,INF);
    MXFLOW(s,t);
    return 0;
}

by da32s1da @ 2018-03-31 14:59:06

搞定了。。。

32次提交,前22次TLE,第32次Ac。。


|