羊吃草--二分图匹配

羊吃草

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

有一个草原可以用一个1~400的数轴表示。有n头羊和q个查询。每头羊的编号分别是1,2,3…n。第i头羊只喜爱数轴上[ai,bi]这样的一个闭区间,每一时刻每头羊只可能在自己喜爱的区间的某个点上吃草。现在给出q个查询,每个查询两个整数l,r。你需要计算出在同一时刻,最多能有多少头羊同时在这个区间内吃草。数轴上每一个整点同一时刻只能容纳一只羊,羊只会在整点吃草。

输入描述:

第一行三个数n q。

第二行n个数a1 a2…an。

第三行n个数b1 b2…bn。

接下来q行每行两个数l,r。表示询问的区间。

输出描述:

对于每个查询,输出一个整数表示答案。

示例1

输入

复制

5 3
1 1 1 2 4
1 1 1 3 5
1 5
2 5
1 3

输出

复制

3
2
2

备注:

1<=n,q<=400

1<=ai<=bi<=400

1=l<=r<=400

 

对于每一个区间的点,连它对应的边。用点去找羊,而不是羊去找点,因为这样点是不确定在哪个区间的。

#include <algorithm>    //STL通用算法
#include <bitset>     //STL位集容器
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>     //复数类
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>      //STL双端队列容器
#include <exception>    //异常处理类
#include <fstream>
#include <functional>   //STL定义运算函数(代替运算符)
#include <limits>
#include <list>      //STL线性列表容器
#include <map>       //STL 映射容器
#include <iomanip>
#include <ios>      //基本输入/输出支持
#include<iosfwd>     //输入/输出系统使用的前置声明
#include <iostream>
#include <istream>     //基本输入流
#include <ostream>     //基本输出流
#include <queue>      //STL队列容器
#include <set>       //STL 集合容器
#include <sstream>    //基于字符串的流
#include <stack>      //STL堆栈容器    
#include <stdexcept>    //标准异常类
#include <streambuf>   //底层输入/输出支持
#include <string>     //字符串类
#include <utility>     //STL通用模板类
#include <vector>     //STL动态数组容器
#include <cwchar>
#include <cwctype>
#define ll long long
using namespace std;
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define dep(i,a,b) for(register int i=(a);i>=(b);i--)
//priority_queue<int,vector<int>,less<int> >q;
int dx[]= {-1,1,0,0,-1,-1,1,1};
int dy[]= {0,0,-1,1,-1,1,1,-1};
const int maxn = 1500+6;
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
int n,m,k;
bool vis[maxn];
int pre[maxn];
vector<int>mmp[maxn];
int dfs(int x)
{
    for(int i=0; i<mmp[x].size(); i++)
    {
        int v=mmp[x][i];
        //cout<<v<<"=="<<vis[v]<<endl;
        if(!vis[v])
        {
            vis[v]=1;
            if(!pre[v]||dfs(pre[v]))
            {
                pre[v]=x;
                // cout<<pre[v]<<"------"<<endl;
                return 1;
            }
        }
    }
    return 0;
}
int a[maxn],b[maxn];
void init()
{
    for(int j=0; j<=900; j++)
    {
        vis[j]=false;
        pre[j]=false;
        mmp[j].clear();
    }
}
int main()
{
    int q;
    while(~scanf("%d %d",&n,&q))///bool
    {
        init();
        rep(i,1,n)
        {
            scanf("%d",&a[i]);//
        }
        rep(i,1,n)
        {
            scanf("%d",&b[i]);
        }
        init();
        for(int i=1; i<=n; i++)
        {
            rep(j,a[i],b[i])
            {
                mmp[j].push_back(i);
            }
        }
        while(q--)
        {
            int ans=0;
            int a1,b1;
            cin>>a1>>b1;
            for(int j=0; j<=900; j++)
            {
                vis[j]=false;
                pre[j]=false; 
            }
            for(int i=a1; i<=b1; i++)
            {
                memset(vis,0,sizeof(vis));
                if(dfs(i))
                    ans++;
            }
            printf("%d\n",ans);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值