这里以3次方来举例讲一下这题的做法,其它维类似。

如果要求某一个值的3次方那么sum = t^3,设t = x+y。那也就是sum = (x+y)^3.

假如我让每个数都加z t = x+y+z,我可以让新的y = y+z,这里发现新来的总会加在y上,那么可以给他一个延迟,slz,

那么新的值t = t + slz,再看如果让每个数都乘k,t = (x+y)*k = xk+yk.可以看出刚才的slz = slz*k; 另外发现系数会跟着变换,可以给他一个延迟,mlz。

那么一个数t = (mlz*x+slz)^3 = mlz^3*x^3+2*mlz^2*slz*x^2+2*mlz*slz^2*x+x^3.

如果求一段这样的和的话,会发现整体就是k1*原本x^3的和+k2*原本x^2的和+k1原本x^1的和 +(r-l+1)*x^3;

这样就可以分别保存3维的和。

把某一段的值设置为v的时候,可以使mlz =0 slz = v.

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 100000
#define LL __int64
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
const int mod = ;
int slz[N<<],mlz[N<<];//lz[N<<2];
LL s[N<<][];
int p[][];
void init()
{
int i,j;
for(i = ; i <= ; i++)
{
p[i][] = i;
for(j = ; j <= ; j++)
p[i][j] = (p[i][j-]*i)%mod;
}
}
void up(int w)
{
for(int i = ; i <= ; i++)
s[w][i] = (s[w<<][i]+s[w<<|][i])%mod;
}
void build(int l,int r,int w)
{
mlz[w] = ;
slz[w] = ;
//lz[w] = 0;
if(l==r)
{
for(int i = ; i <= ; i++)
s[w][i] = ;
return ;
}
int m = (l+r)>>;
build(l,m,w<<);
build(m+,r,w<<|);
up(w);
}
void down(int w,int m)
{ if(mlz[w]!=||slz[w]!=)
{
mlz[w<<] = (mlz[w<<]*mlz[w])%mod;
slz[w<<] = (mlz[w]*slz[w<<]+slz[w])%mod;
mlz[w<<|] = (mlz[w<<|]*mlz[w])%mod;
slz[w<<|] = (mlz[w]*slz[w<<|]+slz[w])%mod; int x1 ,x2,x3,y1,y2,y3;
x1 = mlz[w]; y1 = slz[w];
x2 = p[x1][]; y2 = p[y1][];
x3 = p[x1][]; y3 = p[y1][];
s[w<<][] = (x3*s[w<<][]+(*x2*y1)%mod*s[w<<][]+(*x1*y2)%mod*s[w<<][]+y3*(m-m/))%mod;
s[w<<|][] = (x3*s[w<<|][]+(*x2*y1)%mod*s[w<<|][]+(*x1*y2)%mod*s[w<<|][]+y3*(m/))%mod;
s[w<<][] = (x2*s[w<<][]+(*x1*y1)%mod*s[w<<][]+y2*(m-m/))%mod;
s[w<<|][] = (x2*s[w<<|][]+(*x1*y1)%mod*s[w<<|][]+y2*(m/))%mod;
s[w<<][] = (x1*s[w<<][]+y1*(m-m/))%mod;
s[w<<|][] = (x1*s[w<<|][]+y1*(m/))%mod;
mlz[w] = ;
slz[w] = ;
}
}
void update(int f,int c,int a,int b,int l,int r,int w)
{
if(a<=l&&b>=r)
{
if(f==)
{ mlz[w] = ;
slz[w] = c;
for(int i = ; i <= ; i++)
s[w][i] = (p[c][i]*(r-l+))%mod; }
else if(f==)
{ slz[w]=(slz[w]+c)%mod;
s[w][] = ((s[w][]+*s[w][]*c+*s[w][]*c*c)%mod+(LL)c*c*c*(r-l+))%mod;
s[w][] = ((s[w][]+*c*s[w][])%mod+(LL)c*c*(r-l+))%mod;
s[w][] = s[w][]+c*(r-l+); s[w][]%=mod;
}
else if(f==)
{ mlz[w] *= c;mlz[w]%=mod;
slz[w] *= c;slz[w]%=mod;
// }
//cout<<l<<" "<<r<<" "<<s[w][2]<<endl;
s[w][] = (s[w][]*c*c*c)%mod;
s[w][] = (s[w][]*c*c)%mod;
s[w][] = (c*s[w][])%mod;
//cout<<l<<" "<<r<<" "<<s[w][2]<<endl;
}
return ;
}
down(w,r-l+);
int m = (l+r)>>;
if(a<=m)
update(f,c,a,b,l,m,w<<);
if(b>m) update(f,c,a,b,m+,r,w<<|);
up(w);
}
LL query(int f,int a,int b,int l,int r,int w)
{
if(a<=l&&b>=r)
{
return s[w][f];
}
down(w,r-l+);
int m = (l+r)>>;
LL res=;
if(a<=m) res+=query(f,a,b,l,m,w<<);
res%=mod;
if(b>m) res+=query(f,a,b,m+,r,w<<|);
res%=mod;
return res;
}
int main()
{
int n,m,i;
int k,x,y,c;
init();
while(scanf("%d%d",&n,&m)&&n&&m)
{
build(,n,);
for(i = ;i <= m; i++)
{
scanf("%d%d%d%d",&k,&x,&y,&c);
if(k<=)
update(k,c,x,y,,n,);
else
printf("%I64d\n",(query(c,x,y,,n,))%mod);
}
}
return ;
}

hdu4578Transformation(线段树多个lz标记)的更多相关文章

  1. 【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)

    题目0到n-1的花瓶,操作1在下标a开始插b朵花,输出始末下标.操作2清空[a,b]的花瓶,求清除的花的数量.线段树懒惰标记来更新区间.操作1,先查询0到a-1有num个空瓶子,然后用线段树的性质,或 ...

  2. 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化

    4636: 蒟蒻的数列 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 247  Solved: 113[Submit][Status][Discuss ...

  3. [HDOJ4578]Transformation(线段树,多延迟标记)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 四种操作:查询.加法.乘法.改数.应该是需要维护三个lazy标记,然后就是套路了.查询是区间内所 ...

  4. 扶桑号战列舰 (单调栈+线段树区间更新懒惰标记 or 栈)

    传送门 •题目描述 题目描述 众所周知,一战过后,在世界列强建造超无畏级战列舰的竞争之中,旧日本海军根据“个舰优越主义”,建造了扶桑级战列舰,完工时为当时世界上武装最为强大的舰只. 同时,扶桑号战列舰 ...

  5. 杭电 HDU ACM 1698 Just a Hook(线段树 区间更新 延迟标记)

    欢迎"热爱编程"的高考少年--报考杭州电子科技大学计算机学院 Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memor ...

  6. HDU 3911 Black And White (线段树区间合并 + lazy标记)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3911 给你n个数0和1,m个操作: 0操作  输出l到r之间最长的连续1的个数 1操作  将l到r之间 ...

  7. FZU-1608 Huge Mission 线段树(更新懒惰标记)

    题目链接: https://cn.vjudge.net/problem/FZU-1608 题目大意: 长度n,m次操作:每次操作都有三个数:a,b,c:意味着(a,b]区间单位长度的价值为c,若某段长 ...

  8. HDU 4553 约会安排(线段树区间合并+双重标记)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 题目大意:就是有三种操作: ①DS x,安排一段长度为x的空闲时间跟屌丝一起,输出这段时间的起点 ...

  9. hdu1698 Just a Hook (线段树区间更新 懒惰标记)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

随机推荐

  1. div遮罩弹框口

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  2. 英语发音规则---gh

    英语发音规则---gh 一.总结 一句话总结:gh字母组合的读音在中学英语课本中归纳起来主要有"发音"和"不发音"两种情况. gh字词首是发/g/,因为需要开头 ...

  3. php的CURL使用及例子

    使用PHP的cURL库可以简单和有效地去抓网页.你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了.无论是你想从从一个链接上取部分数据,或是取一个XML文件并把 ...

  4. Linux vSphere SDK for Perl 执行脚本报错

      本人在gentoo系统上安装完vSphere for Perl之后,执行/usr/lib/vmware-viperl/app/vm/vminfo.pl脚本. 提示错误如下: Server vers ...

  5. Java--23种设计模式之decorator模式

    装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性.动态给一个对象增加功能,这些功能可以再动态的撤消.增加由一些基本功能的排列组合而产生的非常大量的 ...

  6. CodeForces 1110H. Modest Substrings

    题目简述:给定$1 \leq l \leq r \leq 10^{800}$,求一个长度为$n \leq 2000$的数字串$s$,其含有最多的[好]子串.一个串$s$是[好]的,如果将其看做数字时无 ...

  7. 非侵入式JavaScript(Unobtrusive javaScript)理解

    转载自 https://my.oschina.net/leegq/blog/279750 在Web的早期阶段,也就是在jQuery出现以前,在同一个文件中混杂JavaScript代码和HTML标记是非 ...

  8. java的Set, List, Map简单介绍

    Set, List, Map Set和List,Map都是集合,Set和List都是继承于Collection接口,而Map不是. 1.Map(映射) :Map是以key,Value的形式存储数据的映 ...

  9. python3 类 组合

    解决类与类之间代码冗余问题有两种解决方案: 第一 是继承,第二是组合 1:继承   描述的是类与类之间的也就是什么是什么的关系 2: 组合  描述的是类与类之间的关系,  是一种什么有什么的关系的,也 ...

  10. HTTP客户端代码片段

    代码片段: public HttpURLConnection connection = null; 设置connection属性 URL url = new URL(urlPath); connect ...