离线+树状数组,ABC253 F - Operations on a Matrix

news2024/12/28 18:28:55

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

F - Operations on a Matrix


二、解题报告

1、思路分析

我们通过差分树状数组,可以轻松解决操作1

操作3我们也可以通过树状数组来获取对应列的值

关键是操作2会对操作3造成影响

所以我们先对询问离线处理,记录每个操作2影响到的操作3

然后顺序处理操作

当遇到操作2,我们将其影响的操作3(i, j)设置初值为 ans = x - col[j],(col[j] 为 第j列累加的值)

遇到操作3时 输出ans + col[j]

2、复杂度

时间复杂度: O(qlogm)空间复杂度:O(Q + N + M)

3、代码详解

 ​
#include <bits/stdc++.h>
// #include <ranges>
// #define DEBUG
using i64 = long long;
using u32 = unsigned;
using u64 = unsigned long long;
constexpr int inf32 = 1E9 + 7;
constexpr i64 inf64 = 1E18 + 7;
constexpr double eps = 1E-9;

template<typename T>
class FenWick {
private:
    int n;
    std::vector<T> tr;
public:
    FenWick(int _n) : n(_n), tr(_n + 1) 
    {}
    FenWick(const std::vector<T> &_init) : FenWick(_init.size()) {
        init(_init);
    }

    void init(const std::vector<T> &_init) {
        for (int i = 1; i <= n; ++ i) {
            tr[i] += _init[i - 1];
            int j = i + (i & -i);
            if (j <= n)
                tr[j] += tr[i];
        }
    }

    void add(T x, T k) {
        for (; x <= n; x += x & -x) tr[x] += k;
    }

    void add(T l, T r, T k) {
        add(l, k), add(r + 1, -k);
    }

    T query(T x) const {
        T res = T{};
        for (; x; x &= x - 1) res += tr[x];
        return res;
    }

    T query(T l, T r) const {
        if (l > r) return T{};
        return query(r) - query(l - 1);
    }

    int select(const T &k) {
        int x = 0;
        T cur{};
        for (int i = 1 << std::__lg(n); i; i /= 2) {
            if (x + i <= n && cur + tr[x + i] <= k) {
                x += i;
                cur = cur + tr[x];
            }
        }
        return x;
    }
};

struct query{
    int op, a, b, c;
};

void solve() {
    int n, m, q;
    std::cin >> n >> m >> q;

    std::vector<query> Q(q);
    std::vector<std::vector<int>> val(q);
    std::vector<int> last(n, -1);
    for (int i = 0; i < q; ++ i) {
        std::cin >> Q[i].op >> Q[i].a >> Q[i].b;
        if (Q[i].op == 1)
            std::cin >> Q[i].c;
        else if(Q[i].op == 2)
            last[Q[i].a - 1] = i;
        else if(~last[Q[i].a - 1])
            val[last[Q[i].a - 1]].push_back(i);
    }    
    
    
    std::vector<i64> ans(q);
    FenWick<i64> tr(m + 1);

    for (int i = 0; i < q; ++ i) {
        if (Q[i].op == 1) {
            tr.add(Q[i].a, Q[i].c);
            tr.add(Q[i].b + 1, -Q[i].c);
        }
        else if(Q[i].op == 2) {
            for (int j : val[i])
                ans[j] = Q[i].b - tr.query(Q[j].b);
        }
        else {
            std::cout << ans[i] + tr.query(Q[i].b) << '\n';
        }
    }
}

auto FIO = []{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return 0;
} ();

int main() {
    #ifdef DEBUG
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
    #endif     

    int t = 1;
    // std::cin >> t;
    while (t --)
        solve();

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1992791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你了解堆和栈的由来吗?

人们提出内存中堆和栈这两个概念&#xff0c;肯定是要解决当时所遇到的问题&#xff0c;不会为了提出概念而提概念。堆和栈都是为了解决一些问题而发展出来的结果&#xff0c;并没有任何的高深之处。 要搞懂堆和栈的概念是如何来的&#xff0c;就需要从计算机诞生时说起了。 …

UE中的运行时Mesh - 学习笔记

UE中的运行时Mesh Runtime Mesh 广泛应用于仿真、游戏及医疗等相关应用领域。 运行时Mesh可以摆脱UE编辑器的依赖&#xff0c;独立开发相对独立的应用程序。 应用示例 地质领域&#xff1a; 模型编辑修改&#xff1a;膨胀 导入、材质设置、补洞及简化&#xff1a; mar…

【Java】韩顺平Java学习笔记 第23章 反射

文章目录 需求和快速入门反射原理反射相关主要类反射的优点和缺点及其优化Class类Class类常用方法获取Class类对象的六种方式有Class对象的类型 类加载动态加载和静态加载类加载时机类加载流程图类加载五个阶段加载阶段连接阶段-验证连接阶段-准备连接阶段-解析总结Initializat…

【Bug记录】operator->返回类型错误导致operator->调用不了

项目场景&#xff1a; 模拟list&#xff0c;出现operator->调用不了的情况&#xff0c;这是什么情况呢&#xff1f;&#xff1f;&#xff1f; 问题描述 这里我是明确写了operator->函数的&#xff1a; 但是却有下面报错&#xff1a; 原因分析&#xff1a; 这里有…

python判断和循环语句

python判断语句 1、单个条件判断 if 条件:满足条件要做的事情1满足条件要做的事情2 else:不满足条件要做的事情3不满足条件要做的事情2 2、多个条件判断&#xff08;满足条件1就不会判断条件2&#xff09; else可以省略不写 if 条件1:满足条件1要做的事情a满足条件1要做的事…

JavaEE从入门到起飞 (三) ~AOP

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 了解面向切面编程&#xff08;AOP&#xf…

牛客网每日刷题之 HJ99.自守数(C++)

在不断学习的过程中也不能忘记了基础知识的巩固&#xff0c;在学习新的知识后要学会去举一反三&#xff0c;前不久我刚刚了解了一些关于 string 类的知识&#xff0c;对牛客网的 自守数 有了新的解题思路&#xff0c;让我们一起看看这道题吧 思路解析 a. 整数方法 1. 首先我们知…

C++(2):λ表达式,类函数重载

λ表达式 [&]捕获前面所有 [i] j闭包函数内访问不了&#xff0c;在函数内i只能用不能改 [&I,j] i在函数内可改j不行 未捕获可以充当函数指针使用 new,delete和malloc,free区别 new会调构造函数 malloc不会&#xff0c;delete会调析构函数free不会malloc调用需要强转…

从混沌到秩序:一本书教你掌握互联网内容审核与信息安全的密钥

随着互联网技术的迅猛发展&#xff0c;视频、图片、文字等多媒体内容以前所未有的速度在全球范围内传播与分享&#xff0c;极大地丰富了人们的信息获取渠道和娱乐生活方式。然而&#xff0c;这一繁荣景象背后&#xff0c;也隐藏着内容安全、版权侵犯、虚假信息传播、不良内容泛…

公司邮箱办理流程复杂吗?三步快速开通公司邮箱

对于许多企业而言, 开通公司邮箱是一项重要的基础建设工作。但是, 很多企业主可能会担心这一过程是否过于繁琐。实际上, 只需要注册、设置域名和邮箱, 以及开始使用这三个步骤。本文将为您介绍如何通过Zoho邮箱快速完成公司邮箱的开通。 Zoho邮箱因其卓越的服务质量和可靠性, …

数据传输为什么占用空间变大了

最近在做数据备份&#xff0c;很尴尬的是&#xff0c;不到3T的数据&#xff0c;用一个4T的硬盘拷贝中转到存储服务器上发现放不下。特别是以小文件为主的标注文件的文件夹&#xff0c;几十M几百M变成几十G或者100多G的空间占用。下面是几张图。 ​ ​ ​ 服务器之间拷贝占用空间…

Linux初启征程指南:攻克常见系统指令与权限初理解

有时候觉得&#xff0c;电脑就像一个高贵冷艳的妹纸。 400&#xff0c;是她冷冰冰地说&#xff1a;“我听不懂你在说什么”&#xff1b; 401&#xff0c;是她无情地转身&#xff1a;“我不认识你&#xff0c;别说那些奇怪的话”&#xff1b; 403&#xff0c;是她残酷的拒绝&…

Mysql-窗口函数二

文章目录 1. 前百分之N的问题 排名 row_number1.1 需求1.2 准备工作1.3 分析1.4 实现 2. 前百分之N的问题 ntile2.1 介绍2.2 语法2.2.1 示例2.2.2 结果示例2.2.3 注意事项 2.3 需求2.4 分析2.5 实现 3. 前百分之N的问题 百分比 PERCENT_RANK3.1 语法3.1.1 示例3.1.2 注意事项 3…

函数的练习

1.判断一个数是否为素数 代码如下&#xff1a; #include <stdio.h> int jum(int num) {int i 0;for (i 2;i < num;i){if (num % i 0){return 0;break;}}return 1; }void Jum1(int (*pf)(int)) {int num 0;printf("请输入操作数&#xff1a;");scanf_s…

声压、声强、响度之间的区别与联系

声压、声强、响度是声学中描述声音特性的重要概念&#xff0c;它们之间有一定的关系&#xff0c;但分别反映了不同的物理或感知特性。 1、声压&#xff08;Sound Pressure&#xff09; 声压是声波传播时在介质中引起的压力波动&#xff0c;通常以帕斯卡&#xff08;Pa&#x…

Windows电脑下载安装Kodcloud可道云结合内网穿透秒变私有网盘

文章目录 1.前言2. Kodcloud网站搭建2.1. Kodcloud下载和安装2.2 Kodcloud网页测试 3. cpolar内网穿透的安装和注册4. 本地网页发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6.结语 1.前言 本文主要为大家介绍一款国人自研的在线Web文件管理器可道云&#xff0c;…

苹果手机数据被抹除还能恢复吗?这两个方法强烈推荐

苹果手机数据被抹除还能恢复吗&#xff1f;我们在使用苹果手机时&#xff0c;有时由于误操作、系统故障或升级失败等原因&#xff0c;导致手机照片、备忘录、视频、联系人等数据被意外抹除。 面对这类情况&#xff0c;我们应该怎么办&#xff1f;下面牛小编给大家的分享2个方法…

CH07_数据绑定

第7章&#xff1a;数据绑定 本章目标 理解路由事件 掌握键盘输入事件 掌握鼠标输入事件 掌握多点触控输入事件 数据绑定概述 什么是数据绑定 ​ 将WPF中的至少一个带有依赖项属性的两个对象的两个属性进行绑定&#xff0c;使某一个依赖项属性可以更新和它绑定的属性的功…

奥尔特曼在X上发了颗“草莓” 网友疯狂猜测:这难道是GPT新模型?

ChatGPT开发商OpenAI的首席执行官山姆奥尔特曼&#xff08;Sam Altman&#xff09;在社交媒体X上发布了一张花园里自种草莓的照片后&#xff0c;引发了众多网友的热议&#xff0c;是否新的GPT模型即将上线&#xff1f; 周三&#xff08;8月7日&#xff09;&#xff0c;奥尔特曼…

海量数据处理商用短链接生成器平台 - 8

第十八章 短链服务-分库分表多维度查询解决方案《钻石玩法》 第1集 短链服务-短链URL跳转302跳转接口开发实战 简介&#xff1a; 短链URL 跳转302跳转接口开发实战 需求 接收一个短链码解析获取原始地址302进行跳转 编码实战 Controller Slf4j public class LinkApiControl…