|  | 
 
 发表于 2023-8-22 16:40:47
|
显示全部楼层 
| 这道题目可以使用线段树来解决。首先,我们需要定义一个线段树节点的数据结构,其中包含了直线的斜率和截距,以及左右子节点的指针。 
 
 复制代码struct Node {
    int k, b;
    Node* left;
    Node* right;
    Node(int _k, int _b) : k(_k), b(_b), left(nullptr), right(nullptr) {}
};
 接下来,我们需要实现线段树的插入和查询函数。在插入函数中,我们首先判断当前节点是否为空,如果为空,则创建一个新的节点并将直线的斜率和截距赋值给节点。如果当前节点不为空,我们需要判断当前直线与节点所代表的直线的关系。如果当前直线与节点所代表的直线平行,则不需要继续向下插入,直接返回。如果当前直线与节点所代表的直线重合,则需要递归向下插入。如果当前直线与节点所代表的直线相交,则需要根据相交的位置判断向左子树还是右子树递归插入。
 
 
 复制代码void insert(Node* root, int k, int b) {
    if (root == nullptr) {
        root = new Node(k, b);
        return;
    }
    if (k == root->k && b == root->b) {
        return;
    }
    if (k == root->k) {
        if (b < root->b) {
            insert(root->left, k, b);
        } else {
            insert(root->right, k, b);
        }
    } else {
        double x = (double)(root->b - b) / (k - root->k);
        if (x < 0) {
            insert(root->left, k, b);
        } else {
            insert(root->right, k, b);
        }
    }
}
 在查询函数中,我们首先判断当前节点是否为空,如果为空,则返回0。如果当前直线与节点所代表的直线平行,则递归查询左右子树并将结果相加。如果当前直线与节点所代表的直线重合,则递归查询左右子树并将结果相加,并且将当前节点的直线计数加1。如果当前直线与节点所代表的直线相交,则递归查询左右子树并将结果相加,并且将当前节点的直线计数加1。
 
 
 复制代码int query(Node* root, int k, int b) {
    if (root == nullptr) {
        return 0;
    }
    if (k == root->k && b == root->b) {
        int count = query(root->left, k, b) + query(root->right, k, b);
        root->count += count;
        return count;
    }
    if (k == root->k) {
        return query(root->left, k, b) + query(root->right, k, b);
    } else {
        double x = (double)(root->b - b) / (k - root->k);
        if (x < 0) {
            return query(root->left, k, b);
        } else {
            return query(root->right, k, b);
        }
    }
}
 最后,我们需要在主函数中读取输入并调用插入和查询函数。
 
 
 复制代码int main() {
    int n;
    cin >> n;
    Node* root = nullptr;
    for (int i = 0; i < n; i++) {
        int op, k, b;
        cin >> op >> k >> b;
        if (op == 1) {
            insert(root, k, b);
        } else if (op == 2) {
            int count = query(root, k, b);
            cout << count << endl;
        }
    }
    return 0;
}
 以上是解决这道题目的完整代码。希望可以帮助到你!
 | 
 |