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. Cmake设置环境变量

    references: http://stackoverflow.com/questions/21047399/cmake-set-environment-variables-from-a-scrip ...

  2. 使用python/casperjs编写终极爬虫-客户端App的抓取-ZOL技术频道

    使用python/casperjs编写终极爬虫-客户端App的抓取-ZOL技术频道 使用python/casperjs编写终极爬虫-客户端App的抓取

  3. 关于cvAbs的那些事

    void cvAbs(const  CvArr* src, const   CvArr*    dst); cvAbs :计算数组中所有的元素的绝对值 // cvAbs函数的使用.cpp : 定义控制 ...

  4. c语言枚举型常量

    #include <stdio.h> //代表百度工程师的级别 enum level { //如果没有指定初始的值 那么c语言会自动分配一个编号 整数编号 T14=,T13=,T12=,T ...

  5. NetAnalyzer笔记 之 八 NetAnalyzer2016使用方法(2)

    [创建时间:2016-05-06 22:07:00] NetAnalyzer下载地址 在写本篇的时候,NetAnalyzer 3.1版本已经发布,所以本篇就以最新版本的为例继续使用,并且顺带说明一下, ...

  6. AIX 常用命令和知识

      BOOTLIST:#bootlist -m normal -o (查看bootlist)#bootlist -m normal (设置bootlist为空,谁要在我机器上执行我就要哭了)#boot ...

  7. LB集群

    LB集群   1. LB.LVS介绍LB集群是load balance 集群的简写,翻译成中文就是负载均衡集群LVS是一个实现负载均衡集群的开源软件项目 LVS架构从逻辑上可分为调度层(Directo ...

  8. Asp.Net HttpApplication请求管道与Session(二)

    Asp.Net 回话的创建与结束 LogHelper.LogHelper _log = new LogHelper.LogHelper(); /// <summary> /// 程序开始- ...

  9. oracle包详解(二)【weber出品】

    一.重载子程序 PL/SQL中的重载功能: 1. 能够使用户创建两个或多个同名的子程序 2. 要求子程序的形式参数的数量,顺序或者数据类型不一样 3. 能够使用户使用不同的数据灵活的调用子程序 4. ...

  10. TortoiseSVN上次文件显示被锁定

    1.可以使用SVN clean up来清除锁定. 2.如果不是本目录锁定,系统提示上一层目录锁定,需要到上一层或者根目录中清除. 3.如果在根目录下都无法clean的话,一般采取的方法是另外找一个目录 ...