当前位置:网站首页>BZOJ 1798 维护序列 (多校连萌,对线段树进行加乘混合操作)
BZOJ 1798 维护序列 (多校连萌,对线段树进行加乘混合操作)
2022-08-04 13:15:00 【51CTO】
题目地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1798
思路:对一段区间的数进行加乘混合操作,思路还是挺巧的,举个例子
sum[rt]为一段区间的和,对区间+x再乘以p(sum[rt]+x)*p=sum[rt]*p+x*p可以写成对这个区间乘以p,每次乘的时候对a[rt]乘p,这个思路很巧
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x3f3f3f3f; //1061109567
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn = 100010;
LL add[ maxn << 2], mul[ maxn << 2], sum[ maxn << 2];
LL p;
void pushup( int rt)
{
sum[ rt] = ( sum[ rt << 1] + sum[ rt << 1 | 1]) % p;
}
void pushdown( int rt, int m)
{
if( add[ rt] == 0 && mul[ rt] == 1)
return;
add[ rt << 1] = ( add[ rt << 1] * mul[ rt] + add[ rt]) % p; //前面包括的是乘,后面包括的是加和先加后乘的
//假设sum[rt]为一段和,(sum[rt]+x)*p,最后的结果只是这一段的和乘以p加上x*p
add[ rt << 1 | 1] = ( add[ rt << 1 | 1] * mul[ rt] + add[ rt]) % p;
mul[ rt << 1] = ( mul[ rt << 1] * mul[ rt]) % p;
mul[ rt << 1 | 1] = ( mul[ rt << 1 | 1] * mul[ rt]) % p;
sum[ rt << 1] = ( sum[ rt << 1] * mul[ rt] + ( m - ( m >> 1)) * add[ rt]) % p; //注意里面的参数
sum[ rt << 1 | 1] = ( sum[ rt << 1 | 1] * mul[ rt] + ( m >> 1) * add[ rt]) % p;
add[ rt] = 0, mul[ rt] = 1;
}
void updata( int L, int R, int value, int l, int r, int rt, int op)
{
if( l >= L && r <= R)
{
if( op == 1)
{
add[ rt] = add[ rt] * value % p;
mul[ rt] = mul[ rt] * value % p;
sum[ rt] = sum[ rt] * value % p;
}
else
{
add[ rt] = ( add[ rt] + value) % p;
sum[ rt] = ( sum[ rt] + ( r - l + 1) * ( LL) value) % p;
}
return;
}
pushdown( rt, r - l + 1);
int m = ( l + r) >> 1;
if( L <= m) updata( L, R, value, lson, op);
if( R > m) updata( L, R, value, rson, op);
pushup( rt);
}
void build( int l, int r, int rt)
{
add[ rt] = 0, mul[ rt] = 1;
if( l == r)
{
scanf( "%lld", & sum[ rt]);
return;
}
int m = ( l + r) >> 1;
build( lson);
build( rson);
pushup( rt);
}
LL query( int L, int R, int l, int r, int rt)
{
if( l >= L && r <= R)
return sum[ rt];
pushdown( rt, r - l + 1);
int m = ( l + r) >> 1;
LL ans = 0;
if( L <= m) ans += query( L, R, lson);
if( R > m) ans += query( L, R, rson);
return ans % p;
}
int main()
{
int n;
while( scanf( "%d%lld", & n, & p) != EOF)
{
build( 1, n, 1);
int m;
scanf( "%d", & m);
for( int i = 0; i < m; i ++)
{
int x, left, right, value;
scanf( "%d", & x);
if( x < 3)
{
scanf( "%d%d%d", & left, & right, & value);
updata( left, right, value, 1, n, 1, x);
}
else
{
scanf( "%d%d", & left, & right);
printf( "%lld\n", query( left, right, 1, n, 1));
}
}
}
return 0;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
边栏推荐
猜你喜欢
RobotFramework二次开发(一)
CLS-PEG-DBCO,胆固醇-聚乙二醇-二苯基环辛炔,可用于改善循环时间
用过Apifox这个API接口工具后,确实感觉postman有点鸡肋......
倒计时 3 天|一起看云原生 Meetup 的六大议题
《社会企业开展应聘文职人员培训规范》团体标准在新华书店上架
Why don't young people like to buy Mengniu and Yili?
持续交付(三)Jenkinsfile语法使用介绍
Haproxy搭建web群集
【PHP实现微信公众平台开发—基础篇】第1章 课程介绍
Motion Rule (16)-Union Check Basic Questions-Grid Game
随机推荐
微信小程序使用腾讯云对象储存上传图片
TS---类型设置
GeoAO:一种快速的环境光遮蔽方案
Ceres库运行,模板内报内存冲突问题。(已解决)
ReentrantLock 原理
MySQL性能指标TPS\QPS\IOPS如何压测?
LeetCode 1403 非递增顺序的最小子序列[贪心] HERODING的LeetCode之路
【PHP实现微信公众平台开发—基础篇】第2章 微信公众账号及申请流程详解
【毕设选题推荐】机器人工程专业毕设选题推荐
漏洞复现 - - - Alibaba Nacos权限认证绕过
【自动微分实现】反向OO实现自动微分(Pytroch核心机制)
持续交付(四)Jenkins多线程任务执行
c#学习_第二弹
Do you understand the various configurations in the project?
router---编程式导航
Interviewer: Tell me the difference between NIO and BIO
LeetCode_643_子数组的最大平均数Ⅰ
双目立体视觉学习笔记(一)
备份控制文件
密码设置十准则