当前位置: 首页 > 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;给出英文读音和中文含义和音标。 本程序查询本地词典数据。通过菜单栏"文件"->"打开词典编辑器"进入编辑界面。 词典数据存储…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...