原题题址
把羊和草对应画成图,就很容易发现是二分图的最大匹配问题,最直接的就是匈牙利算法算法
#include"bits/stdc++.h"
using namespace std;
const int maxn = 5e5+10;
int head[maxn],cnt = 0,N,Q,l[410],r[410],be[410];
bool Vis[410];
struct Edge{
int to,next,v;
}edge[maxn];
void add_edge(int x,int y){
edge[cnt]={y,head[x],1};
head[x] = cnt++;
}
bool dfs(int u){
for(int i = head[u];i >=0;i = edge[i].next)
{
int v = edge[i].to;
if(!Vis[v]){
Vis[v] = 1;
if(!be[v]||dfs(be[v])){
be[v] = u;
return 1;
}
}
}
return 0;
}
int main(){
cin >> N >>Q;
memset(head,-1,sizeof(head));
for(int i = 1;i <= N;i++)
cin >> l[i];
for(int i = 1;i <= N;i++)
cin >> r[i];
for(int i = 1;i <= N;i++){
for(int j = l[i];j <= r[i];j++)
add_edge(j,i);
}
int L,R;
for(int i = 1;i <= Q;i++){
cin >> L >> R;
memset(be,0,sizeof(be));
int ans = 0;
for(int j = L;j <= R;j++){
memset(Vis,0,sizeof(Vis));
if(dfs(j))ans++;
}
cout <<ans<<endl;
}
return 0;
}