链接:

https://loj.ac/problem/6283

题意:

给出一个长为 的数列,以及 个操作,操作涉及区间乘法,区间加法,单点询问。

思路:

考虑整块的乘法, 同时对整块的add标记也要乘,对单点操作时, 注意要对整块暴力修改完再操作.

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
//#include <memory.h>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <math.h>
#include <stack>
#include <string>
#include <assert.h>
#include <iomanip>
#define MINF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e6+10;
const int MOD = 10007; LL a[MAXN], TagMul[MAXN], TagAdd[MAXN];
int Belong[MAXN];
int n, part, last; void Reset(int pos)
{
for (int i = (pos-1)*part+1;i <= pos*part;i++)
a[i] = ((a[i]*TagMul[pos])%MOD+TagAdd[pos])%MOD;
TagAdd[pos] = 0;
TagMul[pos] = 1;
} void UpdateAdd(int l, int r, int c)
{
Reset(Belong[l]);
for (int i = l;i <= min(r, Belong[l]*part);i++)
a[i] = (a[i]+c)%MOD;
if (Belong[l] != Belong[r])
{
Reset(Belong[r]);
for (int i = max(l, (Belong[r]-1)*part+1);i <= r;i++)
a[i] = (a[i]+c)%MOD;
}
for (int i = Belong[l]+1;i <= Belong[r]-1;i++)
TagAdd[i] = (TagAdd[i]+c)%MOD;
} void UpdateMul(int l, int r, int c)
{
Reset(Belong[l]);
for (int i = l;i <= min(r, Belong[l]*part);i++)
a[i] = (a[i]*c)%MOD;
if (Belong[l] != Belong[r])
{
Reset(Belong[r]);
for (int i = max(l, (Belong[r]-1)*part+1);i <= r;i++)
a[i] = (a[i]*c)%MOD;
}
for (int i = Belong[l]+1;i <= Belong[r]-1;i++)
{
TagMul[i] = (TagMul[i]*c)%MOD;
// cout << i << ' ' << TagMul[i] << endl;
TagAdd[i] = (TagAdd[i]*c)%MOD;
}
} int Query(int l, int r, int c)
{
int p = Belong[r];
// cout << a[r] << ' ' << TagMul[p] << ' ' << TagAdd[p] << endl;
return ((a[r]*TagMul[p])%MOD+TagAdd[p])%MOD;
} int main()
{
scanf("%d", &n);
part = sqrt(n);
for (int i = 1;i <= n;i++)
{
TagMul[i] = 1;
scanf("%lld", &a[i]);
Belong[i] = (i-1)/part+1;
}
int op, l, r, c;
for (int i = 1;i <= n;i++)
{
scanf("%d", &op);
if (op == 0)
{
scanf("%d%d%d", &l, &r, &c);
UpdateAdd(l, r, c);
}
else if (op == 1)
{
scanf("%d%d%d", &l, &r, &c);
UpdateMul(l, r, c);
}
else
{
scanf("%d%d%d", &l, &r, &c);
printf("%d\n", Query(l, r, c));
}
} return 0;
}

LOJ-6283-数列分块7的更多相关文章

  1. LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)

    #6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

  2. LOJ#6283. 数列分块入门 7

    对于每个区间先乘在加,如果我修改的是部分的块,我就需要把现这个块的add和mul标记全部放下去,然后再更新. #include<map> #include<set> #incl ...

  3. LOJ——#6277. 数列分块入门 1

    ~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法——分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...

  4. LOJ 6277-6280 数列分块入门 1-4

    数列分块是莫队分块的前置技能,练习一下 1.loj6277 给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值. 直接分块+tag即可 #include <bits/stdc++.h ...

  5. LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)

    #6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给 ...

  6. LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)

    #6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

  7. LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)

    #6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1   题目描述 给出 ...

  8. LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)

    #6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5   题目描述 给出 ...

  9. LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)

    #6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论   题目描述 给出一个 ...

  10. LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))

    #6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3   题目描述 给 ...

随机推荐

  1. 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能

    比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能 对于机器学习的很多问题来说,计算的瓶颈往往在于大规模以及频繁的矩阵运算,主要在于以下两方面: (Dense/Sparse) Matr ...

  2. 【Linux开发】linux设备驱动归纳总结(三):6.poll和sellct

    linux设备驱动归纳总结(三):6.poll和sellct xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  3. 浅谈Angularjs至Angular2后内置指令的变化

    一.科普概要说明 我们常说的 Angular 1 是指 AngularJS: 从Angular 2 开始已经改名了.不再带有JS,只是单纯的 Angular: Angular 1.x 是基于JavaS ...

  4. mysql常用排查命令

    1.查看服务器使用状态 mysqladmin -uroot -p -S /tmp/mysql.sock -r -i 1 ext |\ awk -F"|" \ "BEGIN ...

  5. PHP 调用shell命令

    可以使用的命令: popenfpassthrushell_execexecsystem 1.popen resource popen ( string command, string mode ) 打 ...

  6. [转帖]glib gslibc libc 的关系与区别

    https://blog.csdn.net/Com_ma/article/details/78692092 [glibc 和 libc] glibc 和 libc 都是 Linux 下的 C 函数库. ...

  7. iframe在firefox下的无法正常target问题

    今日在改一个网站的时候碰到个奇葩的问题. 把网站按照结构划分,做了个主页面,嵌入iframe,设定该iframe的name,主页面上的链接使用target保证在iframe中打开该链接. 听上去很常规 ...

  8. 设计模式:解释器模式(Interpreter)

    为人处事是一门大学问,察言观色.听懂弦外之音都是非常重要的,老板跟你说“XX你最近表现平平啊,还得要多努力”,如果你不当回事,平常对待,可能下次就是“XX,恩,你人还是不错,平常工作也很努力,但是我想 ...

  9. 从入门到自闭之Python编码

    ascii码: 支持英文,数字,符号 1字节 不支持中文 gbk(国标) 支持英文,数字,符号 1字节 支持中文 2字节 unicode(万国码): 支持英文,数字,符号 4字节 支持欧洲 4字节 支 ...

  10. Codeforces 1190A. Tokitsukaze and Discard Items

    传送门 显然从左到右考虑每个要删除的数 维护一个 $cnt$ 表示之前已经删除了 $cnt$ 个数,那么当前所有要删除数的实际位置就要减去 $cnt$ 直接暴力枚举哪些数在最左边一个块然后一起删除 每 ...