NC25151. 羊吃草
描述
有一个草原可以用一个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
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; } }