你说得对,但是这就是网络流
查看原帖
你说得对,但是这就是网络流
1440472
R_8x楼主2025/6/16 16:35

仅供整活,30pts

#include<bits/stdc++.h>
using namespace std;
int a[20005];
int n,m;
struct edge
{
	int to,nxt,flow;
};
int tot=1,head[50005],cur[50005],lev[50005];
vector<edge> e;
void add(int u,int v,int w)
{
	++tot;
	e.push_back({v,head[u],w});
	head[u]=tot;
}
queue<int> q;
bool bfs(int s,int t)
{
	memcpy(cur,head,sizeof(head));
	memset(lev,0x3f,sizeof(lev));
	q.push(s);
	lev[s]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=e[i].nxt)
		{
			if(e[i].flow==0)	continue;
			int v=e[i].to;
			if(lev[v]!=0x3f3f3f3f)	continue;
			lev[v]=lev[u]+1;
			q.push(v);
		}
	}
	return lev[t]!=0x3f3f3f3f;
}
int dfs(int p,int t,int maxflow)
{
	int totflow=0;
	if(p==t)	return maxflow;
	for(int &i=cur[p];i;i=e[i].nxt)
	{
		if(lev[e[i].to]==lev[p]+1&&e[i].flow!=0)
		{
			int nowflow=dfs(e[i].to,t,min(maxflow,e[i].flow));
			if(nowflow==0)	lev[e[i].to]=-0x3f3f3f3f;
			totflow+=nowflow;
			e[i].flow-=nowflow;
			e[i^1].flow+=nowflow;
			maxflow-=nowflow;
			if(totflow==maxflow)	break;
		}
	}
	return totflow;
}
void dinic(int s,int t)
{
	int mxflow=0;
	while(bfs(s,t))
		while(int flow=dfs(s,t,0x3f3f3f3f))
			mxflow+=flow;
	cout<<mxflow<<endl;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	e.push_back({0,0,0});
	e.push_back({0,0,0});
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+n+1);
	int ss=n+m+1,tt=ss+1;
	for(int i=1;i<=m;i++)
		add(ss,i,1),add(i,ss,0);
	for(int j=1;j<=n;j++)
		add(j+m,tt,1),add(tt,j+m,0);
	for(int i=1;i<=m;i++)
	{
		int L,R;
		cin>>L>>R;
		int l=lower_bound(a+1,a+n+1,L)-a;
		int r=lower_bound(a+1,a+n+1,R)-a;
		if(a[r]>R||r>n)	r--;
		for(int j=l;j<=r;j++)
			add(i,j+m,1),add(j+m,i,0);
	}
	dinic(ss,tt);
	return 0;
}

2025/6/16 16:35
加载中...