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,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的更多相关文章
- HDU 4578 - Transformation - [加强版线段树]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 Problem Description Yuanfang is puzzled with the ...
- HDU 4578 Transformation (线段树区间多种更新)
http://acm.hdu.edu.cn/showproblem.php?pid=4578 题目大意:对于一个给定序列,序列内所有数的初始值为0,有4种操作.1:区间(x, y)内的所有数字全部加上 ...
- HDU 4578 Transformation (线段树)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- HDU 4578——Transformation——————【线段树区间操作、确定操作顺序】
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- Hdu 4578 Transformation (线段树 分类分析)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- HDU 4578 Transformation --线段树,好题
题意: 给一个序列,初始全为0,然后有4种操作: 1. 给区间[L,R]所有值+c 2.给区间[L,R]所有值乘c 3.设置区间[L,R]所有值为c 4.查询[L,R]的p次方和(1<=p< ...
- hdu 4578 Transformation 线段树
没什么说的裸线段树,注意细节就好了!!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> ...
- hdu 4578 Transformation(线段树)
线段树上的多操作... 题目大意: 树上 的初始值为0,然后有下列三种操作和求和. 1 x y c 在X-Y的之间全部加上C. 2 x y c 在X-Y的之间全部乘上C. 3 x y c ...
- hdu 4578 Transformation 线段树多种操作裸题
自己写了一个带结构体的WA了7.8次 但是测了几组小数据都对..感觉问题应该出在模运算那里.写完这波题解去对拍一下. 以后线段树绝不写struct!一般的struct都带上l,r 但是一条线段的长度确 ...
随机推荐
- cf Magic Numbers
http://codeforces.com/contest/320/problem/A #include <cstdio> #include <cstring> using n ...
- EBS导出键弹性域
select gl_flexfields_pkg.get_description_sql(gcc.chart_of_accounts_id, 1, gcc.segment1) || '-' || gl ...
- jsp中iframe所包含的页面调用父页面的function方法
a.jsp中写了注册的Ext窗体loginWindow,也用iframe包含了另一个b.jsp,当在b.jsp中也有点击注册的链接,这时需要用到调用a.jsp中的loginWindow,因为如果你重新 ...
- c语言else匹配问题
#include <stdio.h> #include <stdlib.h> //实现 依次输入三个递增的数 然后正确输出 //为什么得不到我们想要的结果呢 这就是else匹配 ...
- springmvc+mongodb+maven 项目搭建配置
操作步骤我就不再细化了 项目能运行,测试过了,先上配置,另一篇文章上代码,点击下载源码 项目结构 pom.xml <project xmlns="http://maven.apache ...
- poj 3176 Cow Bowling(dp基础)
Description The cows don't use actual bowling balls when they go bowling. They each take a number (i ...
- pyqt之倒计时例子
from PyQt4.Qt import *from PyQt4.QtCore import *from PyQt4.QtGui import *import sysdef main(): a= ...
- js为鼠标添加右击事件
<script language="javascript"> /*document.oncontextmenu=Youji;*/ //为当前文档添加鼠标右击事件,防 ...
- C++ Primer 学习笔记_77_模板与泛型编程 --实例化
模板与泛型编程 --实例化 引言: 模板是一个蓝图,它本身不是类或函数.编译器使用模板产生指定的类或函数的特定版本号.产生模板的特定类型实例的过程称为实例化. 模板在使用时将进行实例化,类模板在引用实 ...
- eclipse 中 maven3 创建web项目
一.创建项目 1.Eclipse中用Maven创建项目 上图中Next 2.继续Next 3.选maven-archetype-webapp后,next 4.填写相应的信息,Packaged是默认创建 ...