0
点赞
收藏
分享

微信扫一扫

G巴士计数(暑假每日一题 38)


一些城市沿着一条笔直的公路建造。

这些城市从左到右编号为

对于每个 巴士,我们知道它服务的城市范围:第 巴士为编号为 之间的城市(包含 )提供服务。

现在给定你一个城市子集

对于 中包含的每一座城市,我们需要找出有多少辆

输入格式
第一行包含整数 ,表示共有

每组数据第一行包含整数 ,表示

第二行包含 个整数,形式为 ,其中第 i 个 巴士服务于编号从 (包括)的城市。

第三行包含整数 ,表示询问的城市数量。

接下来 行,每行包含一个整数 ,表示一个询问城市的编号。

每组数据之前隔一个空行。

输出格式
每组数据输出一个结果,每个结果占一行。

结果表示为 ​​Case #x: y​​​,其中 是组别编号(从 开始), 个空格隔开的整数,其中第 个整数是为城市 提供服务的

数据范围




输入样例:

2
4
15 25 30 35 45 50 10 20
2
15
25

10
10 15 5 12 40 55 1 10 25 35 45 50 20 28 27 35 15 40 4 5
3
5
10
27

输出样例:

Case #1: 2 1
Case #2: 3 3 4

样例解释
在样例​​​#1​​​中,有四个

第一个服务城市 ,第二个服务城市 ,第三个服务城市 ,第四个服务城市

城市 由第一个和第四个 巴士服务,城市 仅由第一个 巴士服务,因此答案输出为 ​​​2 1​​。

#include<iostream>
#include<cstring>

using namespace std;

const int N = 5010;

int n;
int q[N];

void insert(int l, int r, int w){
if(l > r) swap(l, r);
q[l] += w;
q[r + 1] -= w;
}

int main(){

int t;
cin >> t;
for(int l = 1; l <= t; l++){

printf("Case #%d: ", l);
memset(q, 0, sizeof q);

cin >> n;
int a, b;
for(int i = 0; i < n; i++)
cin >> a >> b, insert(a, b, 1);

for(int i = 1; i < N; i++)
q[i] += q[i - 1];

int k;
cin >> k;
for(int i = 0; i < k; i++){
cin >> a;
cout << q[a] << ' ';
}
cout << endl;
}

return 0;
}


举报

相关推荐

0 条评论