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 B. Petya and Staircases
http://codeforces.com/contest/362/problem/B 先排序,然后判断第一个和最后一个是不是脏的,如果是则输出NO,然后判断其中三个脏的是不是连着的,如果是也输出NO ...
- HADOOP都升级到2.5啦~~~
经过前年的初次接触,现在已大约能理解整个体系啦.MAPREDUCE都改成YARN啦. 不过,还得继续往前走,再能实用... HIVE,HBASE,ZOOKEEPER,, 思路如下: 安装系统,配置网络 ...
- WCF基于Cookie回传的系列(概述)
1 WCF的基本知识(不作细述,园子里有很多的经典的文章系列) 2 WCF的执行过程 3 让服务通信像浏览器发送请求应答一样回传Cookie,并实现Cookie在不同的服务间共享 4 基于共享后的 ...
- java常量设置的方式
我们在写java程序的时候,常常有常量设置,如: public interface Const { //性别的常量 public interface Sex{ public final int 男=1 ...
- bzoj 1196
http://www.lydsy.com/JudgeOnline/problem.php?id=1196 二分+并查集 一共有2*M条路径,我们首先将这2*M条路径按费用排序. 然后二分最大费用的公路 ...
- 特征提取(Detect)、特征描述(Descriptor)、特征匹配(Match)的通俗解释
特征匹配(Feature Match)是计算机视觉中很多应用的基础,比如说图像配准,摄像机跟踪,三维重建,物体识别,人脸识别,所以花一些时间去深入理解这个概念是不为过的.本文希望通过一种通俗易懂的方式 ...
- LeetCode 191. Number of 1 Bits Question
题意:给你一个整数,计算该整数的二进制形式里有多少个“1”.比如6(110),就有2个“1”. 一开始我就把数字n不断右移,然后判定最右位是否为1,是就cnt++,否则就继续右移直到n为0. 可是题目 ...
- 关于打开Eclipse时出现eclipse failed to create the java virtual machine与locking is not possible in the direc
原文转自:http://www.cnblogs.com/steararre/p/4037453.html 今天在机子上使用Eclipse时候打开发现这两个问题,通过查阅资料膜拜大神博客得知解决方法,特 ...
- extern C的作用详解
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C+ ...
- Android开发环境的搭建之(一)Java开发环境的安装
(1) 安装JDK(Java Developer Kit).下载JDK1.8并安装jdk-8u60-windows-i586.exe.下载官方链接http://www.oracle.com/tech ...