首页 > 其他分享 >线段树模板题

线段树模板题

时间:2023-06-02 19:44:49浏览次数:30  
标签:lc int 线段 tag rc sum 模板 mod

目录
.

洛谷3372 线段树区间加法/区间求和

// by DTTTTTTT 2023/6/2
// Luogu 3372
#include<iostream>
#define ll long long
#define lc (p<<1)
#define rc (p<<1|1)
using namespace std;
const int N = 1e5 + 5;
int n, m, a[N];
struct node {
	int l, r;
	ll sum, tag;
}t[N << 2];

void build(int p, int l, int r) {
	t[p].l = l, t[p].r = r, t[p].tag = 0;
	if (l == r) {
		t[p].sum = a[l];
		return;
	}
	int mid = t[p].l + t[p].r >> 1;
	build(lc, l, mid);
	build(rc, mid + 1, r);
	t[p].sum = t[lc].sum + t[rc].sum;
}
void pushdown(int p) {
	if (t[p].l == t[p].r || t[p].tag == 0)
		return;
	t[lc].sum += (t[lc].r - t[lc].l + 1) * t[p].tag;
	t[rc].sum += (t[rc].r - t[rc].l + 1) * t[p].tag;
	t[lc].tag += t[p].tag;
	t[rc].tag += t[p].tag;
	t[p].tag = 0;
}
void add(int p, int l, int r, ll k) {
	if (t[p].l >= l && t[p].r <= r) {
		t[p].sum += (t[p].r - t[p].l + 1) * k;
		t[p].tag += k;
		return;
	}
	pushdown(p);
	int mid = t[p].l + t[p].r >> 1;
	if (l <= mid)
		add(lc, l, r, k);
	if (r > mid)
		add(rc, l, r, k);
	t[p].sum = t[lc].sum + t[rc].sum;
}
ll query(int p, int l, int r) {
	if (t[p].l >= l && t[p].r <= r)
		return t[p].sum;
	pushdown(p);
	int mid = t[p].l + t[p].r >> 1;
	ll ret = 0;
	if (l <= mid)
		ret += query(lc, l, r);
	if (r > mid)
		ret += query(rc, l, r);
	return ret;
}
int main() {
	ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> m;
	for (int i = 1;i <= n;++i)
		cin >> a[i];

	build(1, 1, n);

	while (m--) {
		int op;
		cin >> op;
		if (op == 1) { //加法
			int l, r;
			ll k;
			cin >> l >> r >> k;
			add(1, l, r, k);
		}
		else { //统计
			int l, r;
			cin >> l >> r;
			cout << query(1, l, r) << endl;
		}
	}
	return 0;
}

洛谷3373 线段树区间加法/区间乘法/区间求和

// by DTTTTTTT 2023/6/2
// Luogu 3373
#include<iostream>
#define ll long long
#define lc (p<<1)
#define rc (p<<1|1)
using namespace std;
const int N = 1e5 + 5;
int n, m, mod, a[N];
struct node {
	int l, r, sum, mul_tag, add_tag;
}t[N << 2];
void build(int p, int l, int r) {
	t[p].l = l, t[p].r = r, t[p].mul_tag = 1, t[p].add_tag = 0;
	if (l == r) {
		t[p].sum = a[l];
		return;
	}
	int mid = t[p].l + t[p].r >> 1;
	build(lc, l, mid);
	build(rc, mid + 1, r);
	t[p].sum = t[lc].sum + t[rc].sum;
}
void pushdown(int p) {
	if (t[p].l == t[p].r || (t[p].mul_tag == 1 && t[p].add_tag == 0))
		return;
	
	t[lc].sum = (1ll * t[lc].sum * t[p].mul_tag % mod + 1ll * (t[lc].r - t[lc].l + 1) * t[p].add_tag % mod) % mod;
	t[rc].sum = (1ll * t[rc].sum * t[p].mul_tag % mod + 1ll * (t[rc].r - t[rc].l + 1) * t[p].add_tag % mod) % mod;
	t[lc].mul_tag = 1ll * t[lc].mul_tag * t[p].mul_tag % mod;
	t[rc].mul_tag = 1ll * t[rc].mul_tag * t[p].mul_tag % mod;
	t[lc].add_tag = (1ll * t[lc].add_tag * t[p].mul_tag % mod + t[p].add_tag) % mod;
	t[rc].add_tag = (1ll * t[rc].add_tag * t[p].mul_tag % mod + t[p].add_tag) % mod;

	t[p].mul_tag = 1, t[p].add_tag = 0;
}
void mul(int p, int l, int r, int k) {
	if (t[p].l >= l && t[p].r <= r) {
		t[p].sum = 1ll * t[p].sum * k % mod;
		t[p].mul_tag = 1ll * t[p].mul_tag * k % mod;
		t[p].add_tag = 1ll * t[p].add_tag * k % mod;
		return;
	}
	pushdown(p);
	int mid = t[p].l + t[p].r >> 1;
	if (l <= mid)
		mul(lc, l, r, k);
	if (r > mid)
		mul(rc, l, r, k);
	t[p].sum = (t[lc].sum + t[rc].sum) % mod;
}
void add(int p, int l, int r, int k) {
	if (t[p].l >= l && t[p].r <= r) {
		t[p].sum = (t[p].sum + 1ll * (t[p].r - t[p].l + 1) * k % mod) % mod;
		t[p].add_tag = (t[p].add_tag + k) % mod;
		return;
	}
	pushdown(p);
	int mid = t[p].l + t[p].r >> 1;
	if (l <= mid)
		add(lc, l, r, k);
	if (r > mid)
		add(rc, l, r, k);
	t[p].sum = (t[lc].sum + t[rc].sum) % mod;
}
int query(int p, int l, int r) {
	if (t[p].l >= l && t[p].r <= r)
		return t[p].sum;
	pushdown(p);
	int mid = t[p].l + t[p].r >> 1;
	int ret = 0;
	if (l <= mid)
		ret += query(lc, l, r), ret %= mod;
	if (r > mid)
		ret += query(rc, l, r), ret %= mod;
	return ret;
}
int main() {
	ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> m >> mod;
	for (int i = 1;i <= n;++i)
		cin >> a[i];
	build(1, 1, n);
	for (int i = 1;i <= m;++i) {
		int op;
		cin >> op;
		if (op == 1) { //乘法
			int l, r, k;
			cin >> l >> r >> k;
			mul(1, l, r, k);
		}
		else if (op == 2) { //加法
			int l, r, k;
			cin >> l >> r >> k;
			add(1, l, r, k);
		}
		else { //求和
			int l, r;
			cin >> l >> r;
			cout << query(1, l, r) << endl;
		}
	}
	return 0;
}

标签:lc,int,线段,tag,rc,sum,模板,mod
From: https://www.cnblogs.com/dttttttt/p/17452782.html

相关文章

  • template模板
    C++模板模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。函数模板模板函数定义的一般形式如下所示:template<typenametype>ret-typefunc-name(parameterlist){//函数的主体}在这里,type是函数所使用的数据类型的占位符名称。实例......
  • foxmail导入mht模板
    在安装目录下找到下面文件夹(dir搜*.mht文件)D:\ProgramFiles\Foxmail7.2\Global\Template将自定义模板文件放入该目录......
  • springboot打包jar文件运行后无法读取jar目录中的Excel模板文件
    原因:SpringBoot内嵌web容器,其特点是只有一个jar文件,在容器启动后不会解压缩。解决方式:1.必须使用相对路径读取文件;假设你的模板文件放在了resources—>templates—>xlsx—>test.xlsx2.只能使用流去读取,不能用file;//jar里面文件读取方式: ClassPathResourceclassPathRes......
  • Grafana Query类型模板变量的使用
    一、背景假设我有2种类型的服务器,一种是本地电脑(每个指标名称都存在{nodename=‘mac-local’}),一种是阿里云服务器(每个指标名称都存在{nodename=‘aliyun’}),同时每个指标下都存在一个{instance=‘具体的服务器的ip地址’}标签。即我们采集的时间序列大致上都有如下标签:eg:no......
  • Codeforces 1515I - Phoenix and Diamonds(值域倍增+线段树)
    首先\(c\)很大,因此复杂度跟\(c\)有关的项肯定只能是\(\logc\)之类的。类比IOI2021dungeons的套路,我们对值域进行分层,假设\(c\in[2^{\omega-1},2^{\omega})\),考虑令重量在\(\ge2^{\omega-1}\)的物品为“重物品”,其他物品为“轻物品”,那么一个显然的性质是我们最多只......
  • 企业级springboot项目架构模板V3.0,开箱即用
    此次3.0更新点:1.加入文件服务(quick-storage)功能支持OSS、FTP存储(该服务支持以SDK的方式引入)2.修复sentinel因path路径问题导致流控失效问题3.修复word模板生成PDF文件工具类时首次生成时,图片生成没有成功写入FTP的问题,原因为临时文件路径问题。4.修改部分类的包路径5.auth服......
  • 企业级springboot项目架构模板V1.0,开箱即用
    项目地址:https://gitee.com/liujinxin_ark/quick-template/releases项目问题可在评论中留言,项目持续更新中…quick-template项目介绍软件架构quick-auth-serve工程quick-log-serve工程quick-common工程quick-config工程quick-base-serve工程quick-web-serve工程control目......
  • CF101234A Hacker Cups and Balls【二分+线段树】
    Description给一个长度为n的排列,对它做m次操作,每次对[l,r]区间内进行升序/降序排序。问最后的序列处于最中心的数是多少(n为奇数)。Solution是一类没有写过的题,参考题解。二分答案,对于当前的mid,将大于等于mid的数设置为1,小于mid的数设置为0。这样一来,叶结点的值......
  • C#进行word模板占位符替换的几种工具
    word模板中,包含一些需要替换的项,比如{{姓名}}{{年龄}}或者$姓名$$年龄$,从数据库获取信息后,对模板进行替换操作生成新的word文档。简单对以下四种工具做了一下测试:1.NPOI:是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目NPOI操作word的功能很强大,但是读取占位符时,有一......
  • freemarker模板分页处理
    借鉴博客:https://www.cnblogs.com/zhouyu629/p/12433259.html  1、创建一个分页页面:page.html,里面只有分页的内容<#macrofpagepagepagesizetotalpagestotalrecordsurl><li><span>共${totalrecords}条记录&nbsp;&nbsp;第${page}页/共${totalpages}页</span&......