P8843 [传智杯 #4 初赛] 萝卜数据库

100 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

[传智杯 #4 初赛] 萝卜数据库

题目描述

花栗鼠很喜欢偷吃生产队的大萝卜,因此花栗鼠科技大学正在研究一种新型的数据库,叫做萝卜数据库。

具体来说,它支持 k(1k100)k(1 \leq k \leq 100) 个字段,每个字段名都是整数,里面存储的数值也都是整数。

现在你支持如下操作:

  • 向数据库中插入一个记录,它可能只会包含 kk 个字段的某一部分。具体的操作格式详见“输入格式”。

  • 在数据库中查询有多少条符合条件的记录。

现在你总共有 nn 次操作(1  n10001 \;\leq n \leq 1000),请你对每个回答操作,输出结果。

输入格式

第一行两个整数 n,kn,k ,意义如题所述。

接下来的若干行,每行代表一次操作,具体如下:

  • 1 p x1  y1,...,xp yp1\ p\ x_1\ \ y_1,...,x_p\ y_p :表示一个插入操作,其中共有 pp 个字段,第 ii 字段的名字是 xix_i ,值为 yiy_i .此处我们保证 1xik,1yi10001 \leq x_i \leq k, 1\leq y_i \leq 1000,并且 xi,yix_i,y_i 均为整数。

  • 2 x ymin ymax2\ x\ y_{min}\ y_{max}:表示一次查询操作,表示查询所有满足 字段 xx 的值在 [ymin,ymax][y_{min},y_{max}] 之间的记录有多少个。

输出格式

对于每个查询操作,输出一行一个整数,表示符合条件的记录个数。

样例 #1

样例输入 #1

4 5
1 2 1 2 2 4
2 2 1 5
1 2 3 5 4 6
2 4 7 8

样例输出 #1

1
0

思路分析

  • 首先我们需要一个二维数组来维护我们这道题的存储
  • 当查询为1时,我们只要在二维数组中记录下他们的次数即可
  • 当查询为2时,我们只要在字段中找到与之匹配的数就行了,然后累加起来输出

代码展示

#include<iostream>
using namespace std;

int a[105][1005];
int n, k;

int main()
{
	cin >> n >> k;
	while (n--) {
		int c;
		cin >> c;
		if (c == 1) {
			int p;
			cin >> p;
			while (p--) {
				int x, y;
				cin >> x >> y;
				a[x][y]++;
			}
		}
		else {
			int res = 0;
			int x, y_l, y_r;
			cin >> x >> y_l >> y_r;
			for (int i = y_l; i <= y_r; i++)
				res += a[x][i];
			cout << res << endl;
		}
	}
	return 0;
}

PS:这是第四届传智杯B组的第五道题,一道非常简单的模拟题,可以说一二三五都是送分题,做的快拿个省二好像都没问题~