区间加法,区间乘法,单点查询。

洛谷线段树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的更多相关文章

  1. [LOJ] 分块九题 6

    单点插入,单点查询. 优化了的链表. 链表老写错,干脆用vector,也不算慢. 注意链表退化的问题,及时(比如操作根号n次)就重新建块,实测速度可以提高一倍,这还是数据随机的情况,若涉及大量同一位置 ...

  2. [LOJ] 分块九题 4

    https://loj.ac/problem/6280 区间修改,区间求和. 本来线段树的活. //Stay foolish,stay hungry,stay young,stay simple #i ...

  3. [LOJ] 分块九题 3

    https://loj.ac/problem/6279 区间修改,区间查询前驱. TLE无数,我觉得这代码最精髓的就是block=1000. 谜一样的1000. 两个启示: 块内可以维护数据结构,比如 ...

  4. [LOJ] 分块九题 2

    https://loj.ac/problem/6278 区间修改,查询区间第k大. 块内有序(另存),块内二分. 还是用vector吧,数组拷贝排序,下标搞不来.. //Stay foolish,st ...

  5. [LOJ] 分块九题 1

    https://loj.ac/problem/6277 区间修改,单点查询. //Stay foolish,stay hungry,stay young,stay simple #include< ...

  6. [LOJ] 分块九题 8

    区间查询数值+整体赋值 维护tag代表整个区间被赋成了tag[i] 用pushdown操作,而不是修改了再check. 不压缩代码了,调起来心累,长点有啥不好. //Stay foolish,stay ...

  7. [LOJ] 分块九题 5

    区间开平方,区间查询. lazy标记改为区间是否全是1或者0,这样的区间是没有更新价值的. //Stay foolish,stay hungry,stay young,stay simple #inc ...

  8. 数列分块总结——题目总版(hzwer分块九题及其他题目)(分块)

    闲话 莫队算法似乎还是需要一点分块思想的......于是我就先来搞分块啦! 膜拜hzwer学长神犇%%%Orz 这九道题,每一道都堪称经典,强力打Call!点这里进入 算法简述 每一次考试被炸得体无完 ...

  9. hzwer分块九题(暂时持续更新)

    hzwer分块9题 分块1:区间加法,单点查询 Code #include<bits/stdc++.h> #define in(i) (i=read()) using namespace ...

随机推荐

  1. 51 nod 1521 一维战舰(二分)

    传送门 题意 分析 这是我在51nod上的第2题,下载了4个数据,得不偿失?我太菜啦 一开始wa了6个点,下数据后发现舰与舰不能相邻,再交wa,发现l和r都没设好,再wa,发现check里面[1,b[ ...

  2. python __builtins__ str类 (65)

    65.'str', 字节转换成字符串.第一个传入参数是要转换的字节,第二个参数是按什么编码转换成字符串 class str(object) | str(object='') -> str | s ...

  3. web前端图片预加载

    是什么? 浏览器会缓存静态资源(hmtl/css/img等).图片预加载就是让浏览器提前缓存图片,提升用户体验. 浏览器什么情况下会下载图片? 1,解析到html中img的src属性的时候 2,解析到 ...

  4. (九)SpringBoot整合redis框架

    二:添加Redis依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...

  5. hdu1325 Is It A Tree? 基础并查集

    #include <stdio.h> #include <string.h> ], g[]; int find(int x) //并查集的查找,找到共同的父亲 { if (f[ ...

  6. 牛客国庆集训派对Day_7

    A.Relic Discovery 题目描述 Recently, paleoanthropologists have found historical remains on an island in ...

  7. 18.3.2从Class上获取信息(方法)

    package d18_3_1; import java.lang.reflect.Method; import java.util.Arrays; /** * 获取Class对应类所包含的方法的四个 ...

  8. [已读]编写可维护的javascript

    13年4月份出版,作者是大名鼎鼎的Zakas,他的另两本书<javascript高级程序设计>与<高性能javascript>你一定听过或者读过. 这本书重点讲了编码风格和编码 ...

  9. 【C#】基础之数组排序,对象大小比较(对比器)

    C#基础之数组排序,对象大小比较 原文链接:[OutOfMemory.CN] 从个小例子开始: 1 2 3 int[] intArray = new int[]{2,3,6,1,4,5}; Array ...

  10. 使用JS移除select的某些选项

    var arrvalue = new Array("1", "3", "4", "5", "6", ...