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

devtools/2024/10/18 16:50:41/

一、题目

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 DEBUGfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endif     int t = 1;// std::cin >> t;while (t --)solve();return 0;
}


http://www.ppmy.cn/devtools/91252.html

相关文章

ffmpeg 命令图片和视频转换

1、截图 ffmpeg -i d:\input.mp4 -ss 0:0:10 d:\output.jpg //指定输出分辨率 ffmpeg -i d:\input.mp4 -y -f image2 -ss 0:0:10 -vframes 1 -s 640x360 d:\output.jpg 2、视频分拆图片 ffmpeg -r 输入帧率 -i d:\input.mp4 -r 输出帧率 "d:\outputDir\frame_%04d.jp…

Apache Kylin高级特性:自定义计算与扩展

Apache Kylin高级特性&#xff1a;自定义计算与扩展 引言 Apache Kylin 是一个开源的分布式分析引擎&#xff0c;为大数据集上的多维分析&#xff08;OLAP&#xff09;提供支持。Kylin 通过预计算数据立方体和存储来实现亚秒级查询响应时间&#xff0c;极大地提升了数据分析效…

C语言——编译与链接

目录 引言 翻译环境与运行环境 翻译环境 1.翻译环境的简述 2.编译过程 2.1 预处理&#xff08;预编译&#xff09; 2.2 编译 2.2.1 词法分析 2.2.2 语法分析 2.2.3 语义分析 2.3 汇编 3.链接 运行环境 结束语 引言 C语言编译与链接过程是理解程序如何从代码转化…

案例分享:如何使用原生的NodeJs下载视频网站上的视频资源到本地生成MP4文件

如何使用原生的NodeJs下载视频网站上的视频资源到本地生成MP4文件 1、当下视频网站的视频资源无法通过常规手段下载的原因2、什么是M3U8是什么视频文件?3、如何下载M3U8文件中的TS文件并在本地合并为MP4文件?3.1 FFmpeg 是什么工具?3.2 安装 FFmpeg 工具3.3 使用 FFmpeg 工具…

solidity 数学和密码学函数

数学和密码学函数为开发者提供了一系列强大的工具&#xff0c;用于执行各种数学运算和加密操作 addmod(uint x, uint y, uint k) returns (uint) 计算 (x y) % k&#xff0c;加法会在任意精度下执行&#xff0c;并且加法的结果即使超过 2**256 也不会被截取。 从 0.5.0 版本…

笔面试编程题总结

8/6诺瓦星云 修改程序 void point(int *p){*p p[2];}; int main() {int c[] {1,2,3,4,5},*p c;point(p1);for(;p <c5;){printf("%d",*p);}return 0; }1、分隔字符串 strtok //c语言 #include <stdio.h> #include <string.h>// 函数声明 char* fin…

创建目录命令(mkdir) 学会啦

通过mkdir命令可以创建新的目录&#xff08;文件夹&#xff09; mkdir来自英文&#xff1a; Make Directory 语法&#xff1a; mkdir [-p] Linux路径 参数必填&#xff0c;表示Linux路径&#xff0c;既要创建的文件夹的路径&#xff0c;相对路径或绝对路径均可 wendywendyde…

不仅能防沉迷游戏的防沉迷软件(Python)

介绍 一个有那么一点功能但是又不太保险的防沉迷工具 我脑子进水了才会写这玩意儿 为了变强&#xff0c;我不择手段&#xff08;笑出zhu jiao 代码 好像没什么用的设定界面 # -*- coding: utf-8 -*- # Environment PyCharm # File_name login |User Pfolg # 2024/…