ek算法求调31分
查看原帖
ek算法求调31分
1122530
elpsconr楼主2024/8/2 00:57

感觉很对,不知道为啥才31分

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define cy cout<<"YES"<<endl
#define cn cout<<"NO"<<endl
const int N=3e5+6,yyx=4e9+7;
int n,m,s,t,z,a[N],st[N];
int h[N],idx,d[N],pre[N],ans,dp[N];
struct edge{
    int to,ne,w;
}e[N<<1];
void add(int u,int v,int w){
    e[idx].to=v;e[idx].w=w;e[idx].ne=h[u];h[u]=idx++;
}
void _add(int u,int v,int w){
    add(u,v,w);
    add(v,u,0);
}
int bfs(){
    for(int i=0;i<=n;++i) st[i]=0;
    queue<int> q;
    q.push(s);d[s]=yyx;st[s]=1;
    while(q.size()){
        int x=q.front();q.pop();
        for(int i=h[x];~i;i=e[i].ne){
            int j=e[i].to;
            if(e[i].w<=0) continue;
            if(st[j]) continue;
            st[j]=1;
            d[j]=min(d[x],e[i].w);
            pre[j]=i;
            q.push(j);
            if(j==t) return 1;
        }
    }
    return 0;
}
void update(){
    int x=t;
    while(x!=s){
        int j=pre[x];
        e[j].w-=d[t];
        e[j^1].w+=d[t];
        x=e[j^1].to;
    }
    ans+=d[t];
}
void solve(){
   cin>>n;
   s=0,t=2*n+1;
   memset(h,-1,sizeof h);
   for(int i=1;i<=n;++i) cin>>a[i],dp[i]=1;
   for(int i=1;i<=n;++i){
    for(int j=1;j<i;++j){
        if(a[i]>=a[j]) dp[i]=max(dp[i],dp[j]+1);
    }
   }
   int l=0;
   for(int i=1;i<=n;++i) l=max(l,dp[i]);
   if(l==1){
    cout<<l<<"\n"<<n<<"\n"<<n<<endl;return;
   }
   cout<<l<<endl;
   for(int i=1;i<=n;++i) _add(i,i+n,1);//拆点,将汇入与流出拆开即将i点拆成i.x入点,i.y出点;
   for(int i=1;i<=n;++i) if(dp[i]==1) _add(s,i,1);
   for(int i=1;i<=n;++i) if(dp[i]==l) _add(i+n,t,1);
   for(int i=1;i<=n;++i){
    for(int j=1;j<i;++j){
        if(a[i]>=a[j]&&dp[i]==dp[j]+1) _add(j+n,i,1);
    }
   }
   while(bfs()) update();
   cout<<ans<<endl;
   _add(1,1+n,yyx);_add(s,1,yyx);
   if(dp[n]==l) _add(n,n*2,yyx),_add(n*2,t,yyx);
   while(bfs()) update();
   cout<<ans<<endl;
}//Ek增广路算法
signed main(){
    cin.tie(0)->sync_with_stdio(0);
    int _=1;
    //cin>>_;
    while(_--)
    solve();
    return 0;
}
2024/8/2 00:57
加载中...