http://acm.hdu.edu.cn/showproblem.php?pid=4578

题意:1,a,b,c代表在a,b区间的每一个数加上c;2,a,b,c代表在a,b区间的每一个数乘上c; 3,a,b,c代表在a,b区间的每一个数变为c;4,a,b,c是求在a,b区间的每一个数的c次方的和。

先乘后加。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 100010
using namespace std; int n,m;
struct node
{
int r,l;
int sum;
int add;
int mul;
int sum2;
int sum3;
}tree[maxn*]; void build(int i,int l,int r)
{
tree[i].l=l;
tree[i].r=r;
tree[i].sum=;
tree[i].add=;
tree[i].mul=;
tree[i].sum2=;
tree[i].sum3=;
if(l==r) return ;
int mid=(l+r)>>;
build(i<<,l,mid);
build(i<<|,mid+,r);
} void mull(int i,int data1,int data)
{
(tree[i].sum*=data1)%=;
tree[i].sum2=tree[i].sum2*data1%*data1%;
tree[i].sum3=tree[i].sum3*data1%*data1%*data1%;
(tree[i].mul*=data1)%=;
(tree[i].add*=data1)%=;
(tree[i].sum3+=((tree[i].r-tree[i].l+)%*(data%*data%*data%)))%=;
(tree[i].sum3+=*data%*tree[i].sum2%)%=;
(tree[i].sum3+=(*data%*data%*tree[i].sum%))%=;
(tree[i].sum2+=(tree[i].r-tree[i].l+)*(data*data%)%)%=;
(tree[i].sum2+=(*data%*tree[i].sum%))%=;
(tree[i].sum+=(tree[i].r-tree[i].l+)%*data%)%=;
(tree[i].add+=data)%=;
}
void down(int i)
{
if(tree[i].l==tree[i].r) return ;
mull(i<<,tree[i].mul,tree[i].add);
mull(i<<|,tree[i].mul,tree[i].add);
tree[i].add=;
tree[i].mul=;
}
void update(int i,int l,int r,int data1,int data)
{
if(tree[i].l==l&&tree[i].r==r)
{
mull(i,data1,data);
return ;
}
down(i);
int mid=(tree[i].l+tree[i].r)>>;
if(r<=mid)
{
update(i<<,l,r,data1,data);
}
else if(l>mid)
{
update(i<<|,l,r,data1,data);
}
else
{
update(i<<,l,mid,data1,data);
update(i<<|,mid+,r,data1,data);
}
tree[i].sum=(tree[i<<].sum+tree[i<<|].sum)%;
tree[i].sum2=(tree[i<<].sum2+tree[i<<|].sum2)%;
tree[i].sum3=(tree[i<<].sum3+tree[i<<|].sum3)%;
} int search1(int i,int l,int r,int ch)
{
if(tree[i].l==l&&tree[i].r==r)
{
if(ch==)
return tree[i].sum;
else if(ch==)
return tree[i].sum2;
else if(ch==)
return tree[i].sum3;
}
down(i);
int mid=(tree[i].l+tree[i].r)>>;
if(r<=mid)
{
return search1(i<<,l,r,ch);
}
else if(l>mid)
{
return search1(i<<|,l,r,ch);
}
else
{
return (search1(i<<,l,mid,ch)+search1(i<<|,mid+,r,ch))%;
}
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==) break;
build(,,n);
for(int i=; i<=m; i++)
{
int x,y,op,c;
scanf("%d%d%d%d",&op,&x,&y,&c);
if(op==)
{
update(,x,y,,c);
}
else if(op==)
{
update(,x,y,c,);
}
else if(op==)
{
update(,x,y,,c);
}
else if(op==)
{
printf("%d\n",search1(,x,y,c)%);
}
}
}
return ;
}

hdu 4578 Transformation的更多相关文章

  1. HDU 4578 - Transformation - [加强版线段树]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 Problem Description Yuanfang is puzzled with the ...

  2. HDU 4578 Transformation (线段树区间多种更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=4578 题目大意:对于一个给定序列,序列内所有数的初始值为0,有4种操作.1:区间(x, y)内的所有数字全部加上 ...

  3. HDU 4578 Transformation (线段树)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  4. HDU 4578——Transformation——————【线段树区间操作、确定操作顺序】

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  5. Hdu 4578 Transformation (线段树 分类分析)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  6. HDU 4578 Transformation --线段树,好题

    题意: 给一个序列,初始全为0,然后有4种操作: 1. 给区间[L,R]所有值+c 2.给区间[L,R]所有值乘c 3.设置区间[L,R]所有值为c 4.查询[L,R]的p次方和(1<=p< ...

  7. hdu 4578 Transformation 线段树

    没什么说的裸线段树,注意细节就好了!!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> ...

  8. hdu 4578 Transformation(线段树)

    线段树上的多操作... 题目大意: 树上 的初始值为0,然后有下列三种操作和求和. 1  x y c  在X-Y的之间全部加上C. 2  x y c  在X-Y的之间全部乘上C. 3  x y c   ...

  9. hdu 4578 Transformation 线段树多种操作裸题

    自己写了一个带结构体的WA了7.8次 但是测了几组小数据都对..感觉问题应该出在模运算那里.写完这波题解去对拍一下. 以后线段树绝不写struct!一般的struct都带上l,r 但是一条线段的长度确 ...

随机推荐

  1. Codeforces 335B Palindrome

    http://codeforces.com/contest/335/problem/B 题意:  给定一个长度不超过5*10^4的只包含小写字母的字符串,要求你求它的回文子序列,如果存在长度为100的 ...

  2. Qt中文乱码问题(比较清楚,同一个二进制串被解释成不同的语言)

    文章来源:http://blog.csdn.net/brave_heart_lxl/article/details/7186631 以下是dbzhang关于qt中文乱码问题原因的阐述,觉得不错: 首先 ...

  3. 微软开源PowerShell并支持Linux和OS X

    [微软在开源的道路上加速度了] 从一开始的各种对抗,各种通吃,到现在开始做服务,包罗万象.果然,换了主力,大有不同. 微软今天还宣布开源其.NET框架,令.NET Core能在Linux和OS X上运 ...

  4. redis 验证消息队列也是写磁盘的

    # 下面的例子将会进行把数据写入磁盘的操作: # 900秒(15分钟)之后,且至少1次变更 # 300秒(5分钟)之后,且至少10次变更 # 60秒之后,且至少10000次变更 # # 注意:你要想不 ...

  5. Visual Studio 2012 编译C++显示cl命令

    为了用newlisp来实现VC编译,以便用我的Emacs开发VC程序,而不需要再打开VS 2012, 需要自己实现命令行的编译.我不需要nmake,因为我想直接了解VC编译器,以便今后更好的驾驭它. ...

  6. day57:00:26:34

    今天开始用博客记录倒计时,也只是为了看看今天做了什么.这也是我第一用博客园记录考研生活了 倒计时57天,我在想每天花时间在这记录生活会不会浪费复习的时间,其实不会的了,不去看微博,少刷新闻....仔细 ...

  7. ASP.NET简单文件上传

    一>使用FileUpload控件,将其拖入页面: <%@ Page Title="hehe" Language="C#" MasterPageFil ...

  8. 使用vue-cli脚手架安装的eslint 容易犯错的地方

    1. 函数名字与括号之间要有空格. 2. 不要使用双引号 3. 不要有多月的空行 4.函数参数的逗号后要有空格 5.每个结束语句以后不用加“分号”

  9. JavaScripts学习日记——ECMAscript

    1.Function对象 Function是一个很特殊的对象,特殊在该对象就像java中的方法一样,可以运行,可以传参数. 三种定义function对象的方法: 1.function fun1(a,b ...

  10. GDI+ 颜色表示

     一.GDI+中:Color位于System.Drawing命名空间下.当我们需要使用某种颜色时,我们可以用以下几种方式: ()Color.FromArgb(alpha, red, green, bl ...