当前位置: 首页 > news >正文

P7497 四方喝彩 Solution

Description

给定序列 a = ( a 1 , a 2 , ⋯ , a n ) a=(a_1,a_2,\cdots,a_n) a=(a1,a2,,an),有 m m m 个操作,分四种:

  • add ⁡ ( l , r , v ) \operatorname{add}(l,r,v) add(l,r,v):对于所有 i ∈ [ l , r ] i \in [l,r] i[l,r] 执行 a i ← a i + v a_i \gets a_i+v aiai+v.
  • mul ⁡ ( l , r , v ) \operatorname{mul}(l,r,v) mul(l,r,v):对于所有 i ∈ [ l , r ] i \in [l,r] i[l,r] 执行 a i ← a i × v a_i \gets a_i\times v aiai×v.
  • freeze ⁡ ( l , r , x ) \operatorname{freeze}(l,r,x) freeze(l,r,x):区间 [ l , r ] [l,r] [l,r] 在接下来的 x x x 次操作中被冻结,不会受修改操作影响,已有的冻结效果不会被替换.
  • query ⁡ ( l , r ) \operatorname{query}(l,r) query(l,r):求 ( ∑ i = l r a i ) m o d ( 1 0 9 + 7 ) (\sum\limits_{i=l}^r a_i) \bmod (10^9+7) (i=lrai)mod(109+7).

Limitations

1 ≤ n , m ≤ 2 × 1 0 5 1 \le n,m \le 2\times 10^5 1n,m2×105
0 ≤ a i , v ≤ 1 0 9 + 7 0 \le a_i,v \le 10^9+7 0ai,v109+7
设当前为第 t t t 次操作,则 0 ≤ x ≤ m − k 0 \le x \le m-k 0xmk
1 s , 512 MB 1\text{s},512\text{MB} 1s,512MB

Solution

freeze ⁡ \operatorname{freeze} freeze 操作拆成冻结和解冻两个操作,将解冻操作按解冻时间记在邻接表上.
考虑 add ⁡ \operatorname{add} add,由于区间可能部分冻结,故乘的长度不是 ( r − l + 1 ) (r-l+1) (rl+1) 而是未封锁元素个数,需要维护.
考虑 mul ⁡ \operatorname{mul} mul,同样由于区间可能部分冻结,不能直接 × v \times v ×v,而是将未冻结部分 × v \times v ×v,所以需要分开维护未冻结部分和冻结部分的和.
考虑多个冻结操作重叠,由于合并它们很麻烦,所以直接叠加,等到完全解冻才继续 pushdown,所以维护的是冻结次数而不是是否冻结
写的时候注意细节,具体可以看代码。

Code

8.06 KB , 1.12 s , 31.29 MB (in total, C++20 with O2) 8.06\text{KB},1.12\text{s},31.29\text{MB}\;\texttt{(in total, C++20 with O2)} 8.06KB,1.12s,31.29MB(in total, C++20 with O2)

// Problem: P7497 四方喝彩
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P7497
// Memory Limit: 512 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;using i64 = long long;
using ui64 = unsigned long long;
using i128 = __int128;
using ui128 = unsigned __int128;
using f4 = float;
using f8 = double;
using f16 = long double;template<class T>
bool chmax(T &a, const T &b){if(a < b){ a = b; return true; }return false;
}template<class T>
bool chmin(T &a, const T &b){if(a > b){ a = b; return true; }return false;
}template <int MOD>
struct modint {int val;static int norm(const int& x) { return x < 0 ? x + MOD : x; }modint inv() const {int a = val, b = MOD, u = 1, v = 0, t;while (b > 0) t = a / b, swap(a -= t * b, b), swap(u -= t * v, v);return modint(u);}modint() : val(0) {}modint(const int& m) : val(norm(m % MOD)) {}modint(const long long& m) : val(norm(m % MOD)) {}modint operator-() const { return modint(norm(-val)); }bool operator==(const modint& o) { return val == o.val; }bool operator!=(const modint &o) { return val != o.val; }bool operator<(const modint& o) { return val < o.val; }bool operator>(const modint& o) { return val > o.val; }bool operator<=(const modint& o) { return val <= o.val; }bool operator>=(const modint& o) { return val >= o.val; }modint& operator++() { return *this += 1; }modint operator++(int) { modint temp = *this; ++(*this); return temp; }modint& operator--() { return *this -= 1; }modint operator--(int) { modint temp = *this; --(*this); return temp; }modint& operator+=(const modint& o) { return val = (1ll * val + o.val) % MOD, *this; }modint& operator-=(const modint& o) { return val = norm(1ll * val - o.val), *this; }modint& operator*=(const modint& o) { return val = static_cast<int>(1ll * val * o.val % MOD), *this; }modint& operator/=(const modint& o) { return *this *= o.inv(); }modint& operator^=(const modint& o) { return val ^= o.val, *this; }modint& operator>>=(const modint& o) { return val >>= o.val, *this; }modint& operator<<=(const modint& o) { return val <<= o.val, *this; }modint operator-(const modint& o) const { return modint(*this) -= o; }modint operator+(const modint& o) const { return modint(*this) += o; }modint operator*(const modint& o) const { return modint(*this) *= o; }modint operator/(const modint& o) const { return modint(*this) /= o; }modint operator^(const modint& o) const { return modint(*this) ^= o; }modint operator>>(const modint& o) const { return modint(*this) >>= o; }modint operator<<(const modint& o) const { return modint(*this) <<= o; }friend std::istream& operator>>(std::istream& is, modint& a) {long long v;return is >> v, a.val = norm(v % MOD), is;}friend std::ostream& operator<<(std::ostream& os, const modint& a) { return os << a.val; }friend std::string tostring(const modint& a) { return std::to_string(a.val); }template <class T>friend modint qpow(const modint& a, const T& b) {modint x = a, res = 1;for (T p = b; p; x *= x, p >>= 1)if (p & 1) res *= x;return res;}
};using Z = modint<1000000007>;struct Node {int l, r, size, blocks;Z suma, sumb, add, mul;
};using Tree = vector<Node>;int ls(int u) { return u * 2 + 1; }
int rs(int u) { return u * 2 + 2; }void pushup(Tree& tr, int u) {if (tr[u].blocks == 0) {tr[u].suma = tr[ls(u)].suma + tr[rs(u)].suma;tr[u].sumb = tr[ls(u)].sumb + tr[rs(u)].sumb;tr[u].size = tr[ls(u)].size + tr[rs(u)].size;}
}void apply(Node& rt, Node& son) {if (son.blocks == 0) {son.suma = son.suma * rt.mul + rt.add * son.size;son.add = son.add * rt.mul + rt.add;son.mul *= rt.mul;}
}void pushdown(Tree& tr, int u) {apply(tr[u], tr[ls(u)]);apply(tr[u], tr[rs(u)]);tr[u].add = 0;tr[u].mul = 1;
}void build(Tree& tr, int u, int l, int r, vector<int>& a) {tr[u].l = l;tr[u].r = r;tr[u].mul = 1;tr[u].add = 0;if (l == r) {tr[u].suma = a[l];tr[u].size = 1;return;}int mid = (l + r) >> 1;build(tr, ls(u), l, mid, a);build(tr, rs(u), mid + 1, r, a);pushup(tr, u);
}void add(Tree& tr, int u, int l, int r, Z val) {if (tr[u].l > r || tr[u].r < l || tr[u].blocks > 0) {return;}if (l <= tr[u].l && tr[u].r <= r) {tr[u].suma += val * tr[u].size;tr[u].add += val;return;}int mid = (tr[u].l + tr[u].r) >> 1;pushdown(tr, u);if (l <= mid) {add(tr, ls(u), l, r, val);}if (r > mid) {add(tr, rs(u), l, r, val);}pushup(tr, u);
}void mul(Tree& tr, int u, int l, int r, Z val) {if (tr[u].l > r || tr[u].r < l || tr[u].blocks > 0) {return;}if (l <= tr[u].l && tr[u].r <= r) {tr[u].suma *= val;tr[u].add *= val;tr[u].mul *= val;return;}int mid = (tr[u].l + tr[u].r) >> 1;pushdown(tr, u);if (l <= mid) {mul(tr, ls(u), l, r, val);}if (r > mid) {mul(tr, rs(u), l, r, val);}pushup(tr, u);
}void block(Tree& tr, int u, int l, int r) {if (tr[u].l > r || tr[u].r < l) {return;}if (l <= tr[u].l && tr[u].r <= r) {if (tr[u].l < tr[u].r) {pushdown(tr, u);}if (tr[u].blocks == 0) {tr[u].sumb += tr[u].suma;tr[u].suma = 0;tr[u].size = 0;}tr[u].blocks++;return;}int mid = (tr[u].l + tr[u].r) >> 1;pushdown(tr, u);if (l <= mid) {block(tr, ls(u), l, r);}if (r > mid) {block(tr, rs(u), l, r);}pushup(tr, u);
}void unblock(Tree& tr, int u, int l, int r) {if (tr[u].l > r || tr[u].r < l) {return;}if (l <= tr[u].l && tr[u].r <= r) {tr[u].blocks--;if (tr[u].blocks == 0) {if (tr[u].l == tr[u].r) {tr[u].suma += tr[u].sumb;tr[u].sumb = 0;tr[u].size = 1;}else {pushup(tr, u);}}return;}int mid = (tr[u].l + tr[u].r) >> 1;pushdown(tr, u);if (l <= mid) {unblock(tr, ls(u), l, r);}if (r > mid) {unblock(tr, rs(u), l, r);}pushup(tr, u);
}Z query(Tree& tr, int u, int l, int r) {if (tr[u].l > r || tr[u].r < l) {return 0;}if (l <= tr[u].l && tr[u].r <= r) {return tr[u].suma + tr[u].sumb;}int mid = (tr[u].l + tr[u].r) >> 1;Z ans = 0;pushdown(tr, u);if (l <= mid) {ans += query(tr, ls(u), l, r);}if (r > mid) {ans += query(tr, rs(u), l, r);}return ans;
}signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m;scanf("%d%d", &n, &m);vector<int> a(n);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}Tree seg(n << 2);vector<vector<pair<int, int>>> blocks(m);build(seg, 0, 0, n - 1, a);for (int i = 0, op, l, r, v; i < m; i++) {scanf("%d%d%d", &op, &l, &r);l--, r--;if (op == 1) {scanf("%d", &v);add(seg, 0, l, r, Z(v));}if (op == 2) {scanf("%d", &v);mul(seg, 0, l, r, Z(v));}if (op == 3) {scanf("%d", &v);block(seg, 0, l, r);blocks[i + v].emplace_back(l, r);}if (op == 4) {printf("%d\n", query(seg, 0, l, r).val);}for (auto [le, ri] : blocks[i]) {unblock(seg, 0, le, ri);}}return 0;
}

相关文章:

P7497 四方喝彩 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 个操作&#xff0c;分四种&#xff1a; add ⁡ ( l , r , v ) \operatorname{add}(l,r,v) add(l,r,v)&#xff1a;对于所有 i ∈ [ l , r ] i \in [l,r…...

深入剖析 Bitmap 数据结构:原理、应用与优化策略

深入理解 Bitmap 数据结构 一、引言 在计算机科学领域&#xff0c;数据的高效存储和快速处理一直是核心问题。随着数据量的不断增长&#xff0c;如何用最少的空间和最快的速度来表示和操作数据变得至关重要。Bitmap&#xff08;位图&#xff09;作为一种简洁而强大的数据结构…...

bypass hcaptcha、hcaptcha逆向

可以过steam&#xff0c;已支持并发&#xff0c;欢迎询问&#xff01; 有事危&#xff0c;ProfessorLuoMing...

WebForms DataList 深入解析

WebForms DataList 深入解析 引言 在Web开发领域,控件是构建用户界面(UI)的核心组件。ASP.NET WebForms框架提供了丰富的控件,其中DataList控件是一个灵活且强大的数据绑定控件。本文将深入探讨WebForms DataList控件的功能、用法以及在实际开发中的应用。 DataList控件…...

C# List 列表综合运用实例⁓Hypak原始数据处理编程小结

C# List 列表综合运用实例⁓Hypak原始数据处理编程小结 1、一个数组解决很麻烦引出的问题1.1、RAW 文件尾部数据如下:1.2、自定义标头 ADD 或 DEL 的数据结构如下&#xff1a; 2、程序 C# 源代码的编写和剖析2.1、使用 ref 关键字&#xff0c;通过引用将参数传递&#xff0c;以…...

【C++基础】字符串/字符读取函数解析

最近在学C以及STL&#xff0c;打个基础 参考&#xff1a; c中的char[] ,char* ,string三种字符串变量转化的兼容原则 c读取字符串和字符的6种函数 字符串结构 首先明确三种字符串结构的兼容关系&#xff1a;string>char*>char [] string最灵活&#xff0c;内置增删查改…...

大模型-CLIP 详细介绍

CLIP简介 CLIP&#xff08;Contrastive Language–Image Pre-training&#xff09;是由OpenAI在2021年提出的一种多模态机器学习模型。它旨在通过大量的文本-图像对进行训练&#xff0c;从而学会理解图像内容&#xff0c;并能将这些内容与相应的自然语言描述相匹配。CLIP的核心…...

1.4 Go 数组

一、数组 1、简介 数组是切片的基础 数组是一个固定长度、由相同类型元素组成的集合。在 Go 语言中&#xff0c;数组的长度是类型的一部分&#xff0c;因此 [5]int 和 [10]int 是两种不同的类型。数组的大小在声明时确定&#xff0c;且不可更改。 简单来说&#xff0c;数组…...

WebSocket——环境搭建与多环境配置

一、前言&#xff1a;为什么要使用多环境配置&#xff1f; 在开发过程中&#xff0c;我们通常会遇到多个不同的环境&#xff0c;比如开发环境&#xff08;Dev&#xff09;、测试环境&#xff08;Test&#xff09;、生产环境&#xff08;Prod&#xff09;等。每个环境的配置和需…...

三、递推关系与母函数,《组合数学(第4版)》卢开澄 卢华明

文章目录 一、似函数、非函数1.1 母函数1.2 母函数的简单应用1.3 整数拆分1.4 Ferrers 图像1.5 母函数能做什么1.6 递推关系1.6.1 Hanoi 问题1.6.2 偶数个5怎么算 1.7 Fibonacci 序列1.7.1 Fibonacci 的奇妙性质1.7.2 Fibonacci 恒等式1.7.3 Fibonacci 的直接表达式1.7.4 Fibon…...

线程互斥同步

前言&#xff1a; 简单回顾一下上文所学&#xff0c;上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么&#xff0c;总结一句话&#xff0c;就是tid是用户视角下所认为的概念&#xff0c;因为在Linux系统中&#xff0c;从来没有线程这一说法&#xff0c;…...

DeepSeek R1 AI 论文翻译

摘要 原文地址&#xff1a; DeepSeek R1 AI 论文翻译 我们介绍了我们的第一代推理模型&#xff0c;DeepSeek-R1-Zero 和 DeepSeek-R1。 DeepSeek-R1-Zero 是一个通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;且在此过程中未使用监督微调&#xff08;…...

如何计算态势感知率?

态势感知率&#xff08;Situational Awareness Rate&#xff09;的计算通常需要结合具体应用场景和定义目标&#xff0c;通常涉及对感知、理解、预测三个层次的量化分析。不同领域&#xff08;如网络安全、军事、工业控制等&#xff09;可能有不同的量化方式。通用思路和常见方…...

二、CSS笔记

(一)css概述 1、定义 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离。 2、要点 怎么找到标签怎么操作标签对象(element) 3、css的四种引入方式 3.1 行内式 在标签的style属性中设定CSS样式。这种方…...

Alibaba开发规范_异常日志之日志规约:最佳实践与常见陷阱

文章目录 引言1. 使用SLF4J日志门面规则解释代码示例正例反例 2. 日志文件的保存时间规则解释 3. 日志文件的命名规范规则解释代码示例正例反例 4. 使用占位符进行日志拼接规则解释代码示例正例反例 5. 日志级别的开关判断规则解释代码示例正例反例 6. 避免重复打印日志规则解释…...

使用istio实现权重路由

istio概述 **概述&#xff1a;**Istio 是一个开源的 服务网格&#xff08;Service Mesh&#xff09;解决方案&#xff0c;主要用于管理、保护和监控微服务架构中的服务通信。它为微服务提供了基础设施层的控制功能&#xff0c;不需要更改应用程序的代码&#xff0c;从而解决服…...

M. Triangle Construction

题目链接&#xff1a;Problem - 1906M - Codeforces 题目大意&#xff1a;给一个 n 边形&#xff0c; 每一个边上有a[ i ] 个点&#xff0c; 在此多边形上求可以连的三角形有多少个&#xff0c; 每个点只能用一次。 输入&#xff1a; 第一行是一个整数 N ( 3 ≤ N ≤ 200000…...

每天学点小知识之设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解模板方法模式 模板方法模式是结构最简单的行为型设计模式&#xff0c;在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式&#xff0c;可以将一些复杂流程的实现步骤封装在一系列基…...

机试题——到邻国目标城市的最短距离

题目描述 A国与B国是相邻的两个国家&#xff0c;每个国家都有很多城市。国家内部有很多连接城市的公路&#xff0c;国家之间也有很多跨国公路&#xff0c;连接两个国家的边界城市。两个国家一共有N个城市&#xff0c;编号从1到N&#xff0c;一共有M条公路&#xff0c;包括国内…...

Python + Tkinter + pyttsx3实现的桌面版英语学习工具

Python Tkinter pyttsx3实现的桌面版英语学习工具 在多行文本框输入英文句子&#xff0c;双击其中的英文单词&#xff0c;给出英文读音和中文含义和音标。 本程序查询本地词典数据。通过菜单栏"文件"->"打开词典编辑器"进入编辑界面。 词典数据存储…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...