羊吃草
时间限制: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);
}
}
}