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

信息学奥赛一本通 1551:维护序列

【题目链接】

ybt 1551:维护序列

【题目考点】

1. 线段树
  • 区间修改 区间查询

【解题思路】

本题与洛谷 P3373 【模板】线段树 2大体相同,只有输入输出格式略有不同,具体解析请见上题的博文。

【题解代码】

解法1:线段树

#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define ADD 1
#define MUL 2
struct Node
{int l, r, m, val, tagAdd, tagMul;
} tree[4*N];
int n, p, m, a[N];
void pushUp(int i)
{tree[i].val = (tree[2*i].val+tree[2*i+1].val)%p;
}
void build(int i, int l, int r)
{tree[i].l = l, tree[i].r = r, tree[i].m = l+r>>1, tree[i].tagMul = 1;if(l == r){tree[i].val = a[l];return;}build(2*i, l, tree[i].m);build(2*i+1, tree[i].m+1, r);pushUp(i);
}
void addTag(int type, int i, long long v)//v设为long long保证下面的运算都是long long类型的 
{if(type == ADD){tree[i].tagAdd = (tree[i].tagAdd+v)%p;tree[i].val = (tree[i].val+(tree[i].r-tree[i].l+1)*v)%p;}else //type == MUL{tree[i].tagMul = tree[i].tagMul*v%p;tree[i].tagAdd = tree[i].tagAdd*v%p;//增加的值也乘v tree[i].val = tree[i].val*v%p;}
}
void pushDown(int i)//只有在tagAdd和tagMul二者只有其一时,才能下传 
{if(tree[i].tagAdd == 0 && tree[i].tagMul == 1)return;addTag(MUL, 2*i, tree[i].tagMul);//必须先乘后加 addTag(MUL, 2*i+1, tree[i].tagMul);addTag(ADD, 2*i, tree[i].tagAdd);addTag(ADD, 2*i+1, tree[i].tagAdd);tree[i].tagAdd = 0, tree[i].tagMul = 1;
}
void update(int type, int i, int l, int r, int v)
{if(tree[i].r < l || tree[i].l > r)return;if(l <= tree[i].l && tree[i].r <= r){addTag(type, i, v);return;}pushDown(i);update(type, 2*i, l, r, v);update(type, 2*i+1, l, r, v);pushUp(i);
}
int query(int i, int l, int r)
{if(tree[i].r < l || tree[i].l > r)return 0;if(l <= tree[i].l && tree[i].r <= r)return tree[i].val;pushDown(i);return (query(2*i, l, r) + query(2*i+1, l, r))%p;
}
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int op, t, g, c;cin >> n >> p;for(int i = 1; i <= n; ++i)cin >> a[i];cin >> m;build(1, 1, n);while(m--){cin >> op;if(op == 1){cin >> t >> g >> c;update(MUL, 1, t, g, c);}else if(op == 2){cin >> t >> g >> c;update(ADD, 1, t, g, c);}else{cin >> t >> g;cout << query(1, t, g) << '\n';}}return 0;
}
http://www.xdnf.cn/news/9787.html

相关文章:

  • 为什么在我的Flask里面有两个路由,但是在网页里有一个却不能正确访问到智能体
  • JDBC 核心执行流程详解
  • 如何在矩池云实例上开启应用服务的访问端口
  • 测试策略:AI模型接口的单元测试与稳定性测试
  • ADQ108-1通道8bit 6~7G USB2.0 PXIe cPCIe采集
  • 【大模型面试每日一题】Day 31:LoRA微调方法中低秩矩阵的秩r如何选取?
  • 解决matlab两个库文件名冲突的问题
  • 据传苹果将在WWDC上发布iOS 26 而不是iOS 19
  • 第一章 Linux的例行性工作(计划任务)
  • 大模型深度学习之双塔模型
  • 从 “金屋藏娇” 到 自然语言处理(NLP)
  • 汽车EPS系统的核心:驱动芯片的精准控制原理
  • 高校大数据采集平台产品特色
  • Linux系统管理与编程24:基础条件准备-混搭“本地+阿里云”yum源
  • 替代 WPS 的新思路?快速将 Word 转为图片 PDF
  • Spring Boot 集成 Elasticsearch怎样在不启动es的情况下正常启动服务
  • VR视角下,浙西南革命的热血重生​
  • 打卡day39
  • OpenCV CUDA模块结构分析与形状描述符------在 GPU 上计算图像的原始矩(spatial moments)函数spatialMoments()
  • Python自动化之selenium语句——元素点击、输入、清空和八大元素定位方法
  • 【保姆级教程】Windows部署LibreTV+cpolar实现远程影音库访问全步骤
  • PaddleOCR本地部署 (Python+Flask)
  • 【机器学习基础】机器学习入门核心算法:集成学习(Ensemble Learning)
  • 【.net core】SkiaSharp 如何在Linux上实现
  • ArkUI(方舟UI框架)介绍
  • MinVerse 3D触觉鼠标的技术原理与创新解析
  • MAZANOKE图像优化器本地部署与cpolar随时随地远程使用
  • 设计模式:观察者模式 - 实战
  • MATLAB中的table数据类型:高效数据管理的利器
  • OCC笔记:面、边的方向(TopAbs_Orientation)