这里以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. 在线判题系统hustoj的搭建

    摘要:ACM/ICPC程序设计竞赛,越来越受到各个高校的重视,是程序设计竞赛中的奥林匹克.Hustoj是搭建在linux系统上的判题系统.能够判断代码的正确性.会及时返回通过或者不通过,如果不通过会返 ...

  2. MongoDB 2.6复制集单节点部署(三)

    MongoDB在单节点中也可以做复制集,但是仅限于测试实验,最大的好处就是部署方便快速,可以随便添加新节点,节省资源.在这里我使用的是MongoDB 2.6版本进行复制集实验(但MongoDB配置文件 ...

  3. compileSdkVersion, minSdkVersion 和 targetSdkVersion详解

    API level API level是一个整数,它指的是我们使用的框架(Framework)的版本,也就是我们使用的sdk中的各个平台下的android.jar. 但是这个API level又和An ...

  4. D - Bear and Finding Criminals

    Description There are n cities in Bearland, numbered 1 through n. Cities are arranged in one long ro ...

  5. monkey基本命令及脚本编写

    Monkey 是Android自带的黑盒测试工具,一般通过随机触发界面事件,来确定应用是否会发生异常,多用于android应用的稳定性.压力测试  基本命令: adb shell monkey [op ...

  6. 【Data Structure & Algorithm】字符串全排列

    字符串全排列 题目:输入一个字符串,打印出该字符串的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab.cba. 分析:考察对递归的理 ...

  7. UVa 1631 Locker (DP)

    题意:有一个 n 位密码锁,每位都是0-9,可以循环旋转.同时可以让1-3个相邻数字进行旋转一个,给定初始状态和目状态,问你最少要转多少次. 析:很明显的一个DP题.dp[i][j][k] 表示前 i ...

  8. ES6笔记总结

    常用命令 函数的rest参数和扩展 promise使用 module.exports和Es6 import/export的使用 function sum(x,y,z){ let total = 0; ...

  9. 洛谷 - P5429 - Fence Planning - 并查集

    https://www.luogu.org/problemnew/show/P5429 很明显是要维护整个连通块的共同性质,并查集一搞就完事了. #include<bits/stdc++.h&g ...

  10. 洛谷 - UVA11346 - 概率 Probability - 积分

    要是没学过高等数学的积分怎么办呢?可以求助于自适应辛普森法. 容易发现其实这个图形是对称的,我们只要求第一象限就可以了,第一象限如上图. 由于取点是在面积内等概率的,由高中的几何概型可知,所求概率为: ...