链接:

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. Linux常用目录名称

    目录 用途 / 虚拟目录的根文件,通常不会在这里存储文件 /bin 二进制目录,存放许多用户的GNU工具 /boot 启动目录,存放启动文件 /dev 设备目录,Linux在这里创建设备节点 /etc ...

  2. 应用安全 - PHP - CMS - EmpireCMS - 漏洞 - 汇总

    2006 Empire CMS <= 3.7 (checklevel.php) Remote File Include Vulnerability Empire CMS Checklevel.P ...

  3. CTR点击率校准

    1. 概述 广告CTR预估过程中,正负样本比例差距较大,需要采样,但是采用后模型训练的结果是有偏的. 2. 校准方式 用逻辑回归作为激活函数

  4. AKKA文档2.3(java版)—什么是角色

    原文:http://doc.akka.io/docs/akka/2.3.5/general/actors.html译者:Vitas 什么是角色? 前面角色系统一节介绍了一群角色如何形成一个层次结构,并 ...

  5. Linux基础训练题型(下)

    8.在题3的基础上,使用命令调换passwd文件里root位置和/bin/bash位置?即将所有的第一列和最后一列位置调换? 例: 默认:root:x:0:0:root:/root:/bin/bash ...

  6. jenkins pipline 和 jenkinsfile

    Jenkins Pipeline(或简称为 "Pipeline")是一套插件,将持续交付的实现和实施集成到 Jenkins 中.Jenkins Pipeline 提供了一套可扩展的 ...

  7. javaScript学习总结(二)——jQuery插件的开发

    概要 jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定 ...

  8. FFmpeg4.0笔记:封装ffmpeg的视频帧转换功能类CSws

    Github https://github.com/gongluck/FFmpeg4.0-study/tree/master/Cff CSws.h /************************* ...

  9. Python基础字符串前加u,r,b,f含义

    1.字符串前加 u 例:u"我是含有中文字符组成的字符串." 作用: 后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时 ...

  10. 附录2:CEL文件格式

    一.版本3 描述 version 版本号,设为3 Cols 列数 Rows 行数 TotalX 和Cols一样 TotalY 和Rows一样 OffsetX 无用,设置为0 OffsetY 无用,设置 ...