列表

详情


NC25151. 羊吃草

描述

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

输入描述

第一行三个数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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 6ms, 内存消耗: 504K, 提交时间: 2019-09-07 20:02:49

#include<bits/stdc++.h>
#define max_n 404
using namespace std;
struct node{
	int l,r;
}a[max_n];
int n,q,vis[max_n];
bool cmp(node a,node b)
{
	if(a.r==b.r) 
	return a.l < b.l;
	return a.r < b.r;
}
int main()
{
	cin>>n>>q;
	for(int i=0;i<n;i++)
	cin>>a[i].l;
	for(int i=0;i<n;i++)
	cin>>a[i].r;
	sort(a,a+n,cmp); 
	while(q--)
	{
		int l,r,ans=0;
		cin>>l>>r;
		memset(vis,0,sizeof(vis));
		for(int i=0;i<n;i++)
		{
			for(int j=max(a[i].l,l);j<=min(a[i].r,r);j++)
			if(vis[j]==0)
			{
				ans++;
				vis[j]=1;
				break;
			}
		}
		cout<<ans<<endl;
	}
	return 0;
} 

C++14(g++5.4) 解法, 执行用时: 10ms, 内存消耗: 484K, 提交时间: 2019-09-07 11:17:48

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
int n,q,l,r;
int a[405],b[405];
int main(){
	cin >> n >> q;
	for(int i=1;i<=n;i++){
		cin >> a[i];
	}
	for(int i=1;i<=n;i++){
		cin >> b[i];
	}
	while(q--){
		int ans=0;
		multiset<int> s;
		cin >> l >> r;
		for(int i=1;i<=n;i++){
			if(a[i]<l&&b[i]>=l){
				s.insert(b[i]);
			}
		}
		for(int i=l;i<=r;i++){
			for(int j=1;j<=n;j++)
				if(a[j]==i) s.insert(b[j]);
				if(s.size()) {
					ans ++;
					s.erase(s.begin());
				}
				s.erase(i);
		}
		cout << ans <<endl;
	}
} 

上一题