luogu2023 [AHOI2009]维护序列
线段树加乘懒标记裸题。
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
int n, mod, m, t, u, v;
ll w;
struct SGT{
	ll sum[400005];
	ll lzt[400005];
	ll mul[400005];
	void built(int o, int l, int r){
		lzt[o] = 0;
		mul[o] = 1;
		if(l==r)	scanf("%lld", &sum[o]);
		else{
			int mid=(l+r)>>1;
			int lson=o<<1;
			int rson=lson|1;
			if(l<=mid)	built(lson, l, mid);
			if(mid<r)	built(rson, mid+1, r);
			sum[o] = (sum[lson] + sum[rson]) % mod;
		}
	}
	void push_down(int o, int l, int r, int lson, int rson, int mid){
		mul[lson] = (mul[o] * mul[lson]) % mod;
		mul[rson] = (mul[o] * mul[rson]) % mod;
		lzt[lson] = (mul[o] * lzt[lson]) % mod;
		lzt[rson] = (mul[o] * lzt[rson]) % mod;
		sum[lson] = (mul[o] * sum[lson]) % mod;
		sum[rson] = (mul[o] * sum[rson]) % mod;
		mul[o] = 1;
		lzt[lson] = (lzt[o] + lzt[lson]) % mod;
		lzt[rson] = (lzt[o] + lzt[rson]) % mod;
		sum[lson] = (sum[lson] + (mid-l+1) * lzt[o]) % mod;
		sum[rson] = (sum[rson] + (r-mid) * lzt[o]) % mod;
		lzt[o] = 0;
	}
	void update_add(int o, int l, int r, int x, int y, ll k){
		if(l>=x && r<=y){
			sum[o] = (sum[o] + (r-l+1) * k) % mod;
			lzt[o] = (lzt[o] + k) % mod;
		}
		else{
			int mid=(l+r)>>1;
			int lson=o<<1;
			int rson=lson|1;
			if(mul[o]!=1 || lzt[o])	push_down(o, l, r, lson, rson, mid);
			if(x<=mid)	update_add(lson, l, mid, x, y, k);
			if(mid<y)	update_add(rson, mid+1, r, x, y, k);
			sum[o] = (sum[lson] + sum[rson]) % mod;
		}
	}
	void update_mul(int o, int l, int r, int x, int y, ll k){
		if(l>=x && r<=y){
			mul[o] = (mul[o] * k) % mod;
			lzt[o] = (lzt[o] * k) % mod;
			sum[o] = (sum[o] * k) % mod;
		}
		else{
			int mid=(l+r)>>1;
			int lson=o<<1;
			int rson=lson|1;
			if(mul[o]!=1 || lzt[o])	push_down(o, l, r, lson, rson, mid);
			if(x<=mid)	update_mul(lson, l, mid, x, y, k);
			if(mid<y)	update_mul(rson, mid+1, r, x, y, k);
			sum[o] = (sum[lson] + sum[rson]) % mod;
		}
	}
	ll query(int o, int l, int r, int x, int y){
		if(l>=x && r<=y)	return sum[o];
		else{
			int mid=(l+r)>>1;
			int lson=o<<1;
			int rson=lson|1;
			ll ans=0;
			if(mul[o]!=1 || lzt[o])	push_down(o, l, r, lson, rson, mid);
			if(x<=mid)	ans = (ans + query(lson, l, mid, x, y)) % mod;
			if(mid<y)	ans = (ans + query(rson, mid+1, r, x, y)) % mod;
			return ans;
		}
	}
}sgt;
int main(){
	cin>>n>>mod;
	sgt.built(1, 1, n);
	cin>>m;
	while(m--){
		scanf("%d", &t);
		if(t==1){
			scanf("%d %d %lld", &u, &v, &w);
			sgt.update_mul(1, 1, n, u, v, w);
		}
		else if(t==2){
			scanf("%d %d %lld", &u, &v, &w);
			sgt.update_add(1, 1, n, u, v, w);
		}
		else{
			scanf("%d %d", &u, &v);
			printf("%lld\n", sgt.query(1, 1, n, u, v));
		}
	}
	return 0;
}
												
											luogu2023 [AHOI2009]维护序列的更多相关文章
- BZOJ_1798_[AHOI2009]维护序列_线段树
		
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
 - [Luogu 2023] AHOI2009 维护序列
		
[Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...
 - [洛谷P2023] [AHOI2009]维护序列
		
洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...
 - 洛谷 2023 [AHOI2009]维护序列
		
洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...
 - 洛谷 P2023 [AHOI2009]维护序列
		
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...
 - 洛谷 P2023 [AHOI2009]维护序列 题解
		
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...
 - 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)
		
洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...
 - 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解
		
题目传送: P3373 [模板]线段树 2 P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...
 - P2023 [AHOI2009]维护序列 题解(线段树)
		
题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...
 
随机推荐
- 大数四则运算java(转)
			
// 大数的四则运算 #include <iostream> #include <string> #include <algorithm> using namesp ...
 - 【ros depthimage_to_laser kinect2】
			
kinect2的深度图可以转换成激光来用,使用depthimage_to_laser 这个tf是用来给rviz显示的 1)开启kinect2 rosrun kinect2_bridge kinect2 ...
 - dsniff
			
/usr/local/sbin/dsniff 这个东西好强大,获取到用户名和密码 bt服务区器上:dsniff -i eth0 -m(自动协议检测) 在另外一个电脑上打开网页,登陆ftp服务器,回头看 ...
 - Mysql数据库学习总结(一)
			
数据库概念 数据库(Database)是按照数据结构来组织.存储和管理数据,建立在计算机存储设备上的仓库. 简单说,数据库就是存放数据的仓库.和图书馆存放书籍.粮仓存放粮食类似. 数据库分类 分为 关 ...
 - ffmeg过滤器介绍[转]
			
在ffmpeg中,进行反交错需要用到avfilter,即图像过滤器,ffmpeg中有很多过滤器,很强大,反交错的过滤器是yadif. 基本的过滤器使用流程是: 解码后的画面--->buffer过 ...
 - 【HHHOJ】NOIP2018 模拟赛(二十四) 解题报告
			
点此进入比赛 得分: \(100+60+100\)(挺好的,涨了一波\(Rating\)) 排名: \(Rank\ 1\) \(Rating\):\(+115\) \(T1\):[HHHOJ13]金( ...
 - Zend Studio 12.5.1原版安装破解
			
安装官方Zend Studio 12.5.1原版,关闭zend studio,然后将破解补丁com.zend.verifier_12.5.1.v20150514-2003.jar覆盖到 安装目录\pl ...
 - 初学HBase的几个问题
			
转自 http://itindex.net/detail/50571-hbase-%E9%97%AE%E9%A2%98 本文主要针对对HBase不了解的人.主要想基于个人的理解回答以下几个问题: 什么 ...
 - Java代码工具箱之控制台输出重定向_控制台输出到文件
			
1. 情形:有时候控制台输出太多,在MyEclipse显示不全. 2. 说明:本代码只会重定向 system.out 的内容, error及其它不受代码影响.其它应该类似. //自定导入必要库 //然 ...
 - 表格和网页ico图标
			
表格: 表格格式: <table> <tr> 表格的行 <th >表头</th> <th>表头 </th> </tr> ...