线段树板子

2023-10-26

在这里插入图片描述

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int n, m, k, x, y, op;
int a[N];
struct node {
	int l, r, size, tot, lazy;
}segmentTree[N << 2];
void build(int left, int right, int node) {
	segmentTree[node].size = right - left + 1, segmentTree[node].l = left, segmentTree[node].r = right;
	if(left == right) {
		segmentTree[node].tot = a[left];
		return;
	}
	int mid = left + ((right - left) >> 1);
	build(left, mid, node << 1);
	build(mid + 1, right, node << 1 | 1);
	segmentTree[node].tot = segmentTree[node << 1].tot + segmentTree[node << 1 | 1].tot;
}
void tag(int node, int val) {
	segmentTree[node].tot += segmentTree[node].size * val;
	segmentTree[node].lazy += val;
}
void push_down(int node) {
	if(segmentTree[node].lazy) {
		tag(node << 1, segmentTree[node].lazy), tag(node << 1 | 1, segmentTree[node].lazy);
		segmentTree[node].lazy = 0;
	}
}
void modify(int left, int right, int val, int node) {
	if(left <= segmentTree[node].l && segmentTree[node].r <= right) {
		tag(node, val);
		return;
	}
	push_down(node);
	int mid = segmentTree[node].l + ((segmentTree[node].r - segmentTree[node].l) >> 1);
	if(left <= mid) modify(left, right, val, node << 1);
	if(right > mid) modify(left, right, val, node << 1 | 1);
	segmentTree[node].tot = segmentTree[node << 1].tot + segmentTree[node << 1 | 1].tot;
}
int query(int left, int right, int node) {
	if(left <= segmentTree[node].l && segmentTree[node].r <= right) {
		return segmentTree[node].tot;
	}
	push_down(node);
	int mid = segmentTree[node].l + ((segmentTree[node].r - segmentTree[node].l) >> 1);
	if(left <= mid && right > mid) return query(left, right, node << 1) + query(left, right, node << 1 | 1);
	else if(left <= mid) return query(left, right, node << 1);
	else return query(left, right, node << 1 | 1);
}
signed main() {
	scanf("%lld%lld", &n, &m);
	for(int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
	}
	build(1, n, 1);
	while(m--) {
		scanf("%lld%lld%lld", &op, &x, &y);
		if(op == 1) {
			scanf("%lld", &k); 
			modify(x, y, k, 1);
		} else {
			printf("%lld\n", query(x, y, 1));
		}
	}
	return 0;
}

在这里插入图片描述

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 1e5 + 5;
int n, m, p, x, y, k, op;
int a[N];
struct node{
	int left, right, size, sum, lazy_muti, lazy_add;
} segementTree[N << 2];
void update(int index) {
	segementTree[index].sum = (segementTree[index << 1].sum + segementTree[index << 1 | 1].sum) % p;
}
void tag(int index, int lazy_muti, int lazy_add) {
	segementTree[index].sum = (segementTree[index].sum * lazy_muti + segementTree[index].size * lazy_add) % p;
	segementTree[index].lazy_muti = (segementTree[index].lazy_muti * lazy_muti) % p;
	segementTree[index].lazy_add = (segementTree[index].lazy_add * lazy_muti + lazy_add) % p;
}
void push_down(int index) {
	if(segementTree[index].lazy_muti != 1 || segementTree[index].lazy_add) {
		tag(index << 1, segementTree[index].lazy_muti, segementTree[index].lazy_add);
		tag(index << 1 | 1, segementTree[index].lazy_muti, segementTree[index].lazy_add);
		segementTree[index].lazy_muti = 1;
		segementTree[index].lazy_add = 0;
	}
}
void build(int index, int left, int right) {
	segementTree[index] = {left, right, right - left + 1, 0, 1, 0};
	if(left == right) {
		segementTree[index].sum = a[left];
		return;
	}
	int mid = left + ((right - left) >> 1);
	build(index << 1, left, mid);
	build(index << 1 | 1, mid + 1, right);
	update(index);
}
void muti(int index, int left, int right, int val) {
	if(left <= segementTree[index].left && segementTree[index].right <= right) {
		segementTree[index].lazy_add = (segementTree[index].lazy_add * val) % p;
		segementTree[index].lazy_muti = (segementTree[index].lazy_muti * val) % p;
		segementTree[index].sum = (segementTree[index].sum * val) % p;
		return;
	}
	push_down(index);
	int mid = segementTree[index].left + ((segementTree[index].right - segementTree[index].left) >> 1);
	if(left <= mid) muti(index << 1, left, right, val);
	if(mid < right) muti(index << 1 | 1, left, right, val);
	update(index);
}
void add(int index, int left, int right, int val) {
	if(left <= segementTree[index].left && segementTree[index].right <= right) {
		segementTree[index].lazy_add = (segementTree[index].lazy_add + val) % p;
		segementTree[index].sum = (segementTree[index].sum + segementTree[index].size * val) % p;
		return;
	}
	push_down(index);
	int mid = segementTree[index].left + ((segementTree[index].right - segementTree[index].left) >> 1);
	if(left <= mid) add(index << 1, left, right, val);
	if(mid < right) add(index << 1 | 1, left, right, val);
	update(index);
}
int sum(int index, int left, int right) {
	if(left <= segementTree[index].left && segementTree[index].right <= right) {
		return segementTree[index].sum;
	}
	push_down(index);
	int res = 0;
	int mid = segementTree[index].left + ((segementTree[index].right - segementTree[index].left) >> 1);
	if(left <= mid) res = (res + sum(index << 1, left, right)) % p;
	if(mid < right) res = (res + sum(index << 1 | 1, left, right)) % p;
	return res; 
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m >> p;
	for(int i = 1; i <= n; ++i) {
		cin >> a[i];
	}
	build(1, 1, n);
	while(m--) {
		cin >> op >> x >> y;
		switch(op) {
			case 1: {
				cin >> k;
				muti(1, x, y, k);
				break;
			}
			case 2: {
				cin >> k;
				add(1, x, y, k);
				break;
			}
			case 3: {
				cout << sum(1, x, y) << endl;
				break;
			}
		}
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线段树板子 的相关文章

随机推荐

  • MySQL主从复制,数据库最经典的主从复制你还不知道吗?我不允许!!!

    作者 小刘在C站 个人主页 小刘主页 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 学习两年总结出的运维经验 以及思科模拟器全套网络实验教程 专栏 云计算技术 小刘私信可以随便问 只要会绝不吝啬 感谢CSDN让你我相遇 目录
  • vue+高德地图实现多边形范围内标点

    vue 高德地图实现多边形范围内标点 具体实现 一 安装并引入高德地图 二 创建一个aMap地图文件 三 aMap上创建多边形围栏 四 配置围栏 地图点击事件 五 地图点击标点事件 本篇文章可用于vue项目使用百度地图 获取指定多边形范围内
  • Python 使用VSCode配置代码智能提示的方法(numpy)

    本文主要介绍Python中 使用VSCode作用开发工具时 使用代码智能提示的配置方法 以及使用Numpy时 创建的变量或对象没有提示问题的解决方法 原文地址 Python 使用VSCode配置代码智能提示的方法 numpy
  • STM32CUBEMX_SDIO和FATFS_读写SD卡

    STM32CUBEMX SDIO和FATFS 读写SD卡 简述 FATFS是一个完全免费开源 专为小型嵌入式系统设计的FAT File Allocation Table 文件系统模块 FATFS的编写遵循ANSI C 并且完全与磁盘I O层
  • C++入门--类和对象(上)

    目录 一 C 的类 1 类的引入 2 类的定义 3 类的访问限定符及封装 4 封装 5 类的作用域 6 类的实例化 7 类对象的大小 二 this指针 1 this指针引入 2 this指针的特性 三 C语言和C 实现Stack的对比 1
  • 微信小程序 background-image直接设置本地图片路径,编辑器正常显示,真机运行不显示解决方法

    项目场景 微信小程序 设置background image直接设置本地图片路径 问题描述 编辑器正常显示 真机运行不显示 原因分析 background image只能用网络url或者base64图片编码 解决方案 1 将本地图片转为网络u
  • 用Rsync,实现网站的增量部署

    整个网站通常会很大 尤其的其中静态的图片视频之类 但我们通常不会修改他们 平常只会修改几个文件 如果每次更新都将整个网站从本地上传到服务器 无疑很费时间 如果要找到修改的文件 并只上传这些文件 甚至只上传这些文件修改的部分 无疑会方便很多
  • img.shape img.size

    import cv2 import numpy as np img cv2 imread messi5 jpg print img shape px img 100 100 print px blue img 100 100 0 print
  • WARNING: You are using pip version 19.2.3, however version 20.1.1 is available. -解决方法

    当用PIP下载模块时提示 WARNING You are using pip version 19 2 3 however version 20 1 1 is available You should consider upgrading
  • 寒假日报(2.3-2.5)

    1 终于学完了慕课中的 python3入门机器学习 简单总结回顾一下我学习到的东西 具体的学习笔记以后有时间就补上 Jupyter Notebook的使用 numpy基础 matpotlib绘图 KNN k近邻算法 分类 非监督学习 线性回
  • 实现基于TensorFlow的手写数字识别(1)

    一 MNIST数字识别数据集获取及处理 通过学习林大贵老师的 TensorFlow Keras深度学习人工智能实践应用 对图像处理的过程有了较浅薄的理解 在此与大家分享 同时由于上书中提供的代码下载页面失效 笔者按照书本中的内容手敲代码 如
  • 解决cv2.error: OpenCV(3.4.4) C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:356: erro

    Opencv python中调用cv2 imshow 时出现该错误 解决 图片路径有误 将第一幅图片中路径改为 Image ying3 jpg即可
  • jvm之String

    基本特性 字符串 使用一对 引起来表示 声明为final的 不可被继承 实现了Serializable接口 表示字符串是支持序列化的 实现了Comparable接口 表示String 可以比较大小 在jdk8及以前内部定义了final ch
  • 【封装】封装DML和DQL方法

    封装DML和DQL方法 一 工具类型的封装及普适性泛型工具 1 1 封装DML方法 1 2 封装DQL方法 二 用户案例 一 工具类型的封装及普适性泛型工具 1 1 封装DML方法 public int commonsUpdate Stri
  • H5活动页面遇到的坑+微信分享代码

    h5活动页面功能 在手机上微信分享 1 上传两张图片 2 播放一个背景音乐 很简单是么 那说明你知道的太少了 其实里面的坑好多 一下是制作的心路历程 坑1 iphone上传照片的时候 因为有oriten的原因 所以传上去旋转了 坑2 安卓a
  • Linux rpm命令查询软件包(-q、-qa、-i、-p、-l、-f、-R)

    使用 rpm 做查询命令的格式如下 root localhost rpm 选项 查询对象 rpm q 查询软件包是否安装 用 rpm 查询软件包是否安装的命令格式为 root localhost rpm q 包名 q 表示查询 是 quer
  • 【wpf,C#】wpf调用winform的chart空间,把数据显示成表格曲线

    背景 用wpf想把数据在显示在图表 以一条曲线展示的时候 发现出了问题 wpf不像winform 直接就有chart控件 所以就花了点精力 学会了怎么调用chart控件 最终是为了把数据能够以图表曲线的形式展示出来 当然 wpf还有其他显示
  • IO数据流

    IO流主要是分为字节流和字符流 他们最大的区别是操作的数据单元不同 字节流操作的数据单元占8位 字符流操作的数据单元占16位
  • 【STM32】 工程

    WRITE IN FRONT 介绍 謓泽 正在路上朝着 攻城狮 方向 前进四 荣誉 2021 2022年度博客之星物联网与嵌入式开发TOP5 TOP4 2021 2022博客之星TOP100 TOP63 阿里云专家博主 掘金优秀创作者 全网
  • 线段树板子

    include