这里以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. VOIP语音编码带宽计算

    VOIP Bandwidth consumption naturally depends on the codec used.  VOIP消耗的带宽一般取决于所使用的语音编码. When calcul ...

  2. fhq-treap简介

    \(fhq-treap\)是个好东西啊!无旋转\(treap\)果然是好写,而且还是比较好理解的. 这种数据结构是由神犇fhq发明的.\(Think\ functional!\) fhq神犇说,函数式 ...

  3. docker --help 详解

    [root@c1 _src]# dockerd --help Usage: dockerd [OPTIONS] A self-sufficient runtime for containers. Op ...

  4. 关于chrome被篡改主页修复方法

    打开chrome的属性. 在目标框中追加以下内容 "PATH\chrome.exe" --flag-switches-begin --flag-switches-end about ...

  5. vector中resize()和reserve()区别

    先看看<C++ Primer>中对resize()函数两种用法的介绍: 1.resize(n) 调整容器的长度大小,使其能容纳n个元素. 如果n小于容器的当前的size,则删除多出来的元素 ...

  6. Flutter实战视频-移动电商-53.购物车_商品列表UI框架布局

    53.购物车_商品列表UI框架布局 cart_page.dart 清空原来写的持久化的代码; 添加对应的引用,stless生成一个静态的类.建议始终静态的类,防止重复渲染 纠正个错误,上图的CartP ...

  7. UVa 1641 ASCII Area (计算几何,水题)

    题意:给定一个矩阵,里面有一个多边形,求多边形的面积. 析:因为是在格子里,并且这个多边形是很规则的,所以所有格子不是全属于多边形就是全不属于,或者一半,并且我们可以根据"/"和“ ...

  8. gSoap学习笔记

    http://www.cnblogs.com/xiangism/archive/2012/11/14/2770242.html http://www.cnblogs.com/lvkun/archive ...

  9. 算法学习--Day5

    其实今天是第六天,不过昨天写的题目有些杂乱,都是贪心的算法,所以昨天的题目就不放上来了. 今天开始入手数据结构吧啦吧啦.. 数据结构当时学的时候感觉挺简单的,不过现在真正上代码之后发现情况并不妙,还是 ...

  10. Unity3D asset bundle 格式简析

    http://blog.codingnow.com/2014/08/unity3d_asset_bundle.html Unity3D 的 asset bundle 的格式并没有公开.但为了做更好的差 ...