53pts求条
查看原帖
53pts求条
753640
封禁用户楼主2024/7/2 20:24

对拍挂了1k组没拍出来(((

#include<bits/stdc++.h>
#define sd std::
#define int long long
#define inf 0x3f3f3f3f
#define linf 1e18
#define il inline
#define db double
#define ldb long double
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define f(i,a,b) for(int i=(a);i>=(b);i--)
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)
#define me(x,y) memset(x,y,sizeof x)
#define pii sd pair<int,int>
#define umap(x,y) sd unordered_map<x,y>
#define pque(x) sd priority_queue<x>
#define X first
#define Y second
#define kg putchar(' ')
#define Fr(a) for(auto it:a)
#define dbg(x) sd cout<<#x<<": "<<x<<sd endl
il int read(){int w=1,c=0;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) c=(c<<3)+(c<<1)+ch-48;return w*c;}
void printt(int x){if(x>9) printt(x/10);putchar(x%10+48);}
il void print(int x){if(x<0) putchar('-'),printt(-x);else printt(x);}
il void put(int x){print(x);putchar('\n');}
il void printk(int x){print(x);kg;}
const int N=1e6+10;
struct node
{
	int nex;
	int to;
	int w;
}a[N];
int tot=1,head[N],now[N];
void ad(int u,int v,int w)
{
	a[++tot].nex=head[u];
	head[u]=tot;
	a[tot].to=v;
	a[tot].w=w;
}
void add(int u,int v,int w)
{
	ad(u,v,w);
	ad(v,u,0);
}
int d[N],n,m,s,t;
int bfs()
{
	sd queue<int> q;
	me(d,0);
	d[s]=1;
	q.push(s);
	now[s]=head[s];
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(int i=head[u];i;i=a[i].nex)
		{
			int v=a[i].to,w=a[i].w;
			if(w&&!d[v])
			{
				d[v]=d[u]+1;
				now[v]=head[v];
				q.push(v);
				if(v==t) return 1;
			}
		}
	}
	return 0;
}
int dfs(int u,int flow)
{
	if(u==t||!flow) return flow;
	int tmp=flow;
	for(int i=now[u];i;i=a[i].nex)
	{
		now[u]=i;
		int v=a[i].to,w=a[i].w;
		if(w&&d[v]==d[u]+1)
		{
			int k=dfs(v,MIN(tmp,w));
			if(!k) d[v]=0;
			a[i].w-=k;
			a[i^1].w+=k;
			tmp-=k;
		}
	}
	return flow-tmp;
}
int ans;
int dinic()
{
	while(bfs()) ans+=dfs(s,INT_MAX);
	return ans;
}
//编号:1~n为入点,n+1~2n为拆出来的出点 
int arr[60],dp[60];
il void solve()
{
	n=read();
	if(n==1)
	{
		return put(1),put(1),put(1);
	}
	s=0,t=n+n+1;
	F(i,1,n) arr[i]=read(),dp[i]=1;
	F(i,1,n) F(j,1,i-1) if(arr[j]<=arr[i]) dp[i]=MAX(dp[i],dp[j]+1);
	int ma=0;
	F(i,1,n) ma=MAX(ma,dp[i]);
	put(ma);
	F(i,1,n) F(j,1,i-1) if(arr[j]<=arr[i]&&dp[i]==dp[j]+1) add(j+n,i,1);
	F(i,1,n) if(dp[i]==1) add(s,i,1);
	F(i,1,n) if(dp[i]==ma) add(i+n,t,1);
	F(i,1,n) add(i,i+n,1);
	put(dinic());
	add(1,1+n,inf);add(s,1,inf);
	if(dp[n]==ma) add(n,n+n,inf),add(n+n,t,inf);
	put(dinic());
}
signed main()
{
	int T=1;
//	T=read();
	while(T--) solve();
    return 0;
}



2024/7/2 20:24
加载中...