[LOJ] 分块九题 7
区间加法,区间乘法,单点查询。
洛谷线段树2
屡清加法乘法的关系,定义答案为 a*mut+add
对于整块:
新的乘w,mut和add都要乘w
新的加w,add加w
//Stay foolish,stay hungry,stay young,stay simple
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cctype>
using namespace std;
inline int read_d(){
int ret=0,f=1;char c;
while(c=getchar(),!isdigit(c)) f=c=='-'?-1:1;
while(isdigit(c)){
ret=ret*10+c-'0';
c=getchar();
}
return ret*f;
}
const int MAXN=500005;
const int MOD=10007;
int n;
int num,block;
int a[MAXN],l[MAXN],r[MAXN],bl[MAXN];
int add[MAXN],mut[MAXN];
void pushdown(int id){
for(int i=l[id];i<=r[id];i++){
a[i]=(a[i]*mut[id]+add[id]) % MOD;
}
mut[id]=1;
add[id]=0;
}
void build(){
block=sqrt(n);
num=n/block;
if(n%block) num++;
for(int i=1;i<=num;i++){
l[i]=(i-1)*block+1;
r[i]=i*block;
mut[i]=1;
}
for(int i=1;i<=n;i++){
bl[i]=(i-1)/block+1;
}
r[num]=n;
}
int query(int x){
return (((a[x]*mut[bl[x]])%MOD)+add[bl[x]])%MOD;
}
void updata_mut(int x,int y,int w){
if(bl[x]==bl[y]){
pushdown(bl[x]);
for(int i=x;i<=y;i++){
a[i]*=w;
a[i]%=MOD;
}
return ;
}
pushdown(bl[x]);
for(int i=x;i<=r[bl[x]];i++){
a[i]*=w;a[i]%=MOD;
}
pushdown(bl[y]);
for(int i=l[bl[y]];i<=y;i++){
a[i]*=w;a[i]%=MOD;
}
for(int i=bl[x]+1;i<=bl[y]-1;i++){
mut[i]*=w;mut[i]%=MOD;
add[i]*=w;add[i]%=MOD;
}
}
void updata_add(int x,int y,int w){
if(bl[x]==bl[y]){
pushdown(bl[x]);
for(int i=x;i<=y;i++){
a[i]+=w;
}
return ;
}
pushdown(bl[x]);
for(int i=x;i<=r[bl[x]];i++){
a[i]+=w;a[i]%=MOD;
}
pushdown(bl[y]);
for(int i=l[bl[y]];i<=y;i++){
a[i]+=w;a[i]%=MOD;
}
for(int i=bl[x]+1;i<=bl[y]-1;i++){
add[i]+=w;add[i]%=MOD;
}
}
int main(){
n=read_d();
for(int i=1;i<=n;i++){
a[i]=read_d();
}
build();
for(int i=1;i<=n;i++){
int q=read_d(),x=read_d(),y=read_d(),w=read_d();
if(q==0) updata_add(x,y,w);
if(q==1) updata_mut(x,y,w);
if(q==2) printf("%d\n",query(y));
}
return 0;
}
[LOJ] 分块九题 7的更多相关文章
- [LOJ] 分块九题 6
单点插入,单点查询. 优化了的链表. 链表老写错,干脆用vector,也不算慢. 注意链表退化的问题,及时(比如操作根号n次)就重新建块,实测速度可以提高一倍,这还是数据随机的情况,若涉及大量同一位置 ...
- [LOJ] 分块九题 4
https://loj.ac/problem/6280 区间修改,区间求和. 本来线段树的活. //Stay foolish,stay hungry,stay young,stay simple #i ...
- [LOJ] 分块九题 3
https://loj.ac/problem/6279 区间修改,区间查询前驱. TLE无数,我觉得这代码最精髓的就是block=1000. 谜一样的1000. 两个启示: 块内可以维护数据结构,比如 ...
- [LOJ] 分块九题 2
https://loj.ac/problem/6278 区间修改,查询区间第k大. 块内有序(另存),块内二分. 还是用vector吧,数组拷贝排序,下标搞不来.. //Stay foolish,st ...
- [LOJ] 分块九题 1
https://loj.ac/problem/6277 区间修改,单点查询. //Stay foolish,stay hungry,stay young,stay simple #include< ...
- [LOJ] 分块九题 8
区间查询数值+整体赋值 维护tag代表整个区间被赋成了tag[i] 用pushdown操作,而不是修改了再check. 不压缩代码了,调起来心累,长点有啥不好. //Stay foolish,stay ...
- [LOJ] 分块九题 5
区间开平方,区间查询. lazy标记改为区间是否全是1或者0,这样的区间是没有更新价值的. //Stay foolish,stay hungry,stay young,stay simple #inc ...
- 数列分块总结——题目总版(hzwer分块九题及其他题目)(分块)
闲话 莫队算法似乎还是需要一点分块思想的......于是我就先来搞分块啦! 膜拜hzwer学长神犇%%%Orz 这九道题,每一道都堪称经典,强力打Call!点这里进入 算法简述 每一次考试被炸得体无完 ...
- hzwer分块九题(暂时持续更新)
hzwer分块9题 分块1:区间加法,单点查询 Code #include<bits/stdc++.h> #define in(i) (i=read()) using namespace ...
随机推荐
- (2)javascript的基本语法、数据结构、变量
本篇学习资料主要讲解javascript的基本语法.数据结构.变量 无论是传统的编程语言,还是脚本语言,都具有数据类型.常量和变量.运算符.表达式.注释语句.流程控制语句等基本元素构成,这些 ...
- 一篇文章搞定面试中的链表题目(java实现)
最近总结了一下数据结构和算法的题目,这是第二篇文章,关于链表的,第一篇文章关于二叉树的参见 废话少说,上链表的数据结构 class ListNode { ListNode next; int val; ...
- 鸟哥私房菜基础篇:Linux是什么习题
猫宁!!! 参考链接:http://cn.linux.vbird.org/linux_basic/0110whatislinux.php#ex 鸟哥是为中国信息技术发展做出巨大贡献的人. 1-你在你的 ...
- 第十七篇 .NET高级技术之XML
Xml 简介(可扩展标记语言) XML优点:容易读懂:格式标准任何语言都内置了XML分析引擎,不用单独进行文件分析引擎的编写. Xml就是用一种格式化的方式来存储数据,我们可以通过用记事本打开. .n ...
- C#中,用HashTable,DataTable等复制和克隆浅谈
如有雷同,不胜荣欣,若转载,请注明 在C#中,用HashTable,DataTable等复制和克隆浅谈,下面直接看例子 HashTable ht = null; ht = new HashTable( ...
- import和from .xxx import *的一点重要区别
import zzz 不会导入zzz中已导入的模块 from .xxx import * 会导入xxx中已导入的模块 特别注意: 使用logging时,x模块导入了log.py,y模块导入了log.p ...
- dangerouslySetHTML 和 style 属性
这一节我们来补充两个之前没有提到的属性,但是在 React.js 组件开发中也非常常用,但是它们也很简单. dangerouslySetHTML 出于安全考虑的原因(XSS 攻击),在 React.j ...
- 【学习笔记】深入理解js原型和闭包(17)——补this
本文对<深入理解js原型和闭包(10)——this>一篇进行补充,原文链接:https://www.cnblogs.com/lauzhishuai/p/10078307.html 原文中, ...
- android开发工具eclipse的安装与配置
l开发主要应用Eclipse 3.7版本. l辅助工具为jdk.Androidsdk Android环境搭建 –1.1.JDK安装 –1.2.Eclipse安装 –1.3.Android SDK安 ...
- js获取上周、本周、下周的时间
//获取上周起始时间结束时间.下周起始时间结束时间开始时间和本周起始时间结束时间;(西方) function getTime(n) { var now = new Date(); var year = ...