P8843 [传智杯 #4 初赛] 萝卜数据库 ---- 嵌套数组

题目描述

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

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

现在你支持如下操作:

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

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

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

输入格式

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

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

  • 1\ p\ x_1\ \ y_1,...,x_p\ y_p1 p x1  y1,...,xp yp :表示一个插入操作,其中共有 pp 个字段,第 ii 字段的名字是 x_ixi ,值为 y_iyi .此处我们保证 1 \leq x_i \leq k, 1\leq y_i \leq 10001xik,1yi1000,并且 x_i,y_ixi,yi 均为整数。

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

输出格式

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

输入输出样例

输入 #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
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <unordered_map>
#include <map>
using namespace std;

int main() {
    int k; // 最大长度为k
    int n; // n次操作
    int type; // 操作类别
    int p; // 插入数量
    int x, y; // 名字与值
    int maxy, miny; // 查询范围
    vector<vector<int>> res(1001);
    cin >> n >> k;
    while (n--) {
        cin >> type;
        if (type == 1) { //插入操作
            cin >> p;
            while (p--) {
                cin >> x >> y;
                res[x-1].emplace_back(y);
            }
        }
        else{
            int c = 0;
            cin >> x >> miny >> maxy;
            for (auto& i : res[x - 1])if (i >= miny && i <= maxy)c++;
            cout << c << endl;
        }
    }
    return 0;
}

 

posted @ 2022-11-20 16:51  slowlydance2me  阅读(63)  评论(0编辑  收藏  举报