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

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...