Problem Description
Yuanfang is puzzled with the question below:
There
are n integers, a1, a2, …, an. The initial
values of them are 0. There are four kinds of operations.
Operation 1: Add c
to each number between ax and ay inclusive. In other
words, do transformation ak<---ak+c, k =
x,x+1,…,y.
Operation 2: Multiply c to each number between ax and
ay inclusive. In other words, do transformation
ak<---ak×c, k = x,x+1,…,y.
Operation 3: Change the
numbers between ax and ay to c, inclusive. In other words,
do transformation ak<---c, k = x,x+1,…,y.
Operation 4: Get the
sum of p power among the numbers between ax and ay
inclusive. In other words, get the result of
axp+ax+1p+…+ay
p.
Yuanfang has no idea of how to do it. So he wants to ask you to
help him. 
                                                         --by HDUoj
http://acm.hdu.edu.cn/showproblem.php?pid=4578


因为p<4,所以,直接线段树维护区间和,平方和,立方和,三棵树,打上乘法,加法,更改标记,注意down的顺序;
所以,会线段树的话,这题主要考代码能力......和信仰。
记得及时取模。
代码如下:
 #include<cstdio>
#define mod 10007
using namespace std; long long tree[][];
long long mark1[],mark2[],mark3[]; int n,m,L,R;
long long a,b; void work();
void build(int ,int ,int );
void up(int );
void down(int ,int ,int );
void change(int ,int ,int );
long long sum(int ,int ,int ); int main()
{
while()
{
scanf("%d%d",&n,&m);
if(n==&&m==)
return ;
work();
}
} void work()
{
int i;
long long ans=;
build(,n,);
for(i=;i<=m;i++)
{
scanf("%d%d%d%d",&b,&L,&R,&a);
if(b==)
{
ans=sum(,n,);
printf("%lld\n",ans%mod);
}
else
change(,n,);
}
} void build(int l,int r,int nu)
{
tree[][nu]=tree[][nu]=tree[][nu]=mark1[nu]=mark3[nu]=;
mark2[nu]=;
if(l==r)
return ;
int mid=(l+r)>>;
build(l,mid,nu<<);
build(mid+,r,nu<<|);
} void up(int nu)
{
tree[][nu]=(tree[][nu<<]+tree[][nu<<|])%mod;
tree[][nu]=(tree[][nu<<]+tree[][nu<<|])%mod;
tree[][nu]=(tree[][nu<<]+tree[][nu<<|])%mod;
} void down(int l,int r,int nu)
{
int mid=(l+r)>>;
if(mark3[nu])
{
tree[][nu<<]=tree[][nu<<]=tree[][nu<<]=;
mark1[nu<<]=;mark2[nu<<]=;
mark3[nu<<]=mark3[nu];
tree[][nu<<|]=tree[][nu<<|]=tree[][nu<<|]=;
mark1[nu<<|]=;mark2[nu<<|]=;
mark3[nu<<|]=mark3[nu];
}
tree[][nu<<]=(tree[][nu<<]*mark2[nu]*mark2[nu]*mark2[nu])%mod;
tree[][nu<<]=(tree[][nu<<]*mark2[nu]*mark2[nu])%mod;
tree[][nu<<]=(tree[][nu<<]*mark2[nu])%mod;
tree[][nu<<]=(tree[][nu<<]+*tree[][nu<<]*mark1[nu]+*tree[][nu<<]*mark1[nu]*mark1[nu]+(mid-l+)*mark1[nu]*mark1[nu]*mark1[nu])%mod;
tree[][nu<<]=(tree[][nu<<]+*mark1[nu]*tree[][nu<<]+(mid-l+)*mark1[nu]*mark1[nu])%mod;
tree[][nu<<]=(tree[][nu<<]+mark1[nu]*(mid-l+))%mod;
mark2[nu<<]=(mark2[nu<<]*mark2[nu])%mod;
mark1[nu<<]=(mark1[nu<<]*mark2[nu]+mark1[nu])%mod;
tree[][nu<<|]=(tree[][nu<<|]*mark2[nu]*mark2[nu]*mark2[nu])%mod;
tree[][nu<<|]=(tree[][nu<<|]*mark2[nu]*mark2[nu])%mod;
tree[][nu<<|]=(tree[][nu<<|]*mark2[nu])%mod;
tree[][nu<<|]=(tree[][nu<<|]+*tree[][nu<<|]*mark1[nu]+*tree[][nu<<|]*mark1[nu]*mark1[nu]+(r-mid)*mark1[nu]*mark1[nu]*mark1[nu])%mod;
tree[][nu<<|]=(tree[][nu<<|]+*mark1[nu]*tree[][nu<<|]+(r-mid)*mark1[nu]*mark1[nu])%mod;
tree[][nu<<|]=(tree[][nu<<|]+mark1[nu]*(r-mid))%mod;
mark2[nu<<|]=(mark2[nu<<|]*mark2[nu])%mod;
mark1[nu<<|]=(mark1[nu<<|]*mark2[nu]+mark1[nu])%mod;
mark1[nu]=mark3[nu]=;mark2[nu]=;
} void change(int l,int r,int nu)
{
if(L<=l&&r<=R)
{
if(b==)
{
mark1[nu]=a;
mark2[nu]=;
mark3[nu]=;
tree[][nu]=a*(r-l+)%mod;
tree[][nu]=(a*a*(r-l+))%mod;
tree[][nu]=(a*a*a*(r-l+))%mod;
}
if(b==)
{
mark1[nu]=(mark1[nu]*a)%mod;
mark2[nu]=(mark2[nu]*a)%mod;
tree[][nu]=(tree[][nu]*a)%mod;
tree[][nu]=(tree[][nu]*a*a)%mod;
tree[][nu]=(tree[][nu]*a*a*a)%mod;
}
if(b==)
{
mark1[nu]=(mark1[nu]+a)%mod;
tree[][nu]=(tree[][nu]+*tree[][nu]*a+*tree[][nu]*a*a+(r-l+)*a*a*a)%mod;
tree[][nu]=(tree[][nu]+*a*tree[][nu]+(r-l+)*a*a)%mod;
tree[][nu]=(tree[][nu]+a*(r-l+))%mod;
}
return;
}
down(l,r,nu);
int mid=(l+r)>>;
if(L<=mid)
change(l,mid,nu<<);
if(R>=mid+)
change(mid+,r,nu<<|);
up(nu);
} long long sum(int l,int r,int nu)
{
long long su=;
if(L<=l&&r<=R)
return tree[a][nu];
down(l,r,nu);
int mid=(l+r)>>;
if(L<=mid)
su+=sum(l,mid,nu<<);
if(R>=mid+)
su+=sum(mid+,r,nu<<|);
su=su%mod;
return su;
}
祝AC哟;

HDU P4578 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

    http://acm.hdu.edu.cn/showproblem.php?pid=4578 题意:1,a,b,c代表在a,b区间的每一个数加上c:2,a,b,c代表在a,b区间的每一个数乘上c: 3 ...

  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 (线段树 分类分析)

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

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

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

  8. hdu 4578 Transformation 线段树

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

  9. hdu 4578 Transformation(线段树)

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

随机推荐

  1. Oracle数据库的下载和安装

    那天分享一下Oracle的下载和安装的过程,有需要的朋友可以借鉴参考一下.如有雷同不胜感激! 首先可以到Oracle的官网下载Oracle的最次年版本的Oracle数据库.一下是个人下载的数据库版本百 ...

  2. Jquery 操作Html 控件 CheckBox、Radio、Select 控件

    在使用 Javascript 编写前台脚本的时候,经常会操作 Html 控件,比如 checkbox.radio.select,用 Jquery 库操作其他会方便很多,下面用Jq对这些控件的操作进行一 ...

  3. HDU 2985 Another lottery(坑题)

    点我看题目 题意 : 有n个人,每个人可以玩m轮,每一轮中每个参与者都有cj张票,第 i 轮的奖金是2的i次方,问你每个人所能赢得最多的奖金的概率是多少. 思路 : 这个题比较坑啊,其实不用去算前几轮 ...

  4. HDOJ多校联合第四场

    B题: C题:仅由'A','G','C','T',4个字母组成,给定一个字符串S,|S|<=15,给定一个整数m,以m为长度且仅含4种字母的字符串T,求LCS(S,T)为0,1,2,3....| ...

  5. strspn和strcspn妙用

    http://blog.csdn.net/aidenliu/article/details/5460201

  6. 152. Maximum Product Subarray

    题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...

  7. STL priority_queue sort 自定义比较终极模板

    比较有两种重载,一种是类内部的bool operator<( 只有一个参数 ),当然bool operator< 也可以拿到类的外面:另外一种是写一个cmp,利用cmp返回作为sort的第 ...

  8. 被IDEA的打包功能打败了:dubbo服务端打包注意事项

    下午在搭建一个基于dubbo和spring的服务端项目.结果打包成jar后各种报错. 起初是因为idea的机制,导致META-INF下自己的Mainfest.mf总是莫名被覆盖,于是报找不到主函数.后 ...

  9. 【原创】FPGA开发手记(二) VGA接口

    以下内容均以Xilinx的Nexys3作为开发板 1.VGA接口介绍 首先,先看电路图(3*5为例): 标准VGA一共15个接口,但是实际应用的接口信号只用五个:HSYNC,行同步信号:VSYNC,场 ...

  10. Eclipse设置、问题解决方案

    Eclipse设置: 1.如何把eclipse关闭提示调出来? 可以这样打开这个提示:选择 Windows --Preferences,在左边树上选择“General” --“Startup and ...