感觉很对,不知道为啥才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;
}