题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578

题目大意:n个数(初始为0)m个操作,操作类型有4种,操作1把区间的每个数+a,操作2把区间的每个数*a.,操作3把区间的每个数=a,操作4,查询区间每个数p次方的和(1<=p<=3)

解:

线段树解决,考虑的问题有两个:

1、赋值操作一定放在前面,然后有 先+后* 和 先*后+ 效果不一样

2、p次方和

对于问题一,采用先*后+的方式,这样在加入一个乘法标记的时候只用给之前的加标记乘上新标记的数即可

对于问题二,把(a+b)^2 和 (a+b)^3 展开,就知道怎么处理了

 /*
* Problem:
* Author: SHJWUDP
* Created Time: 2015/11/3 星期二 15:20:05
* File Name: 1001.cpp
* State:
* Memo:
*/
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#include <list> using namespace std; const int MOD=1e4+; struct SegmentTree {
struct Node {
vector<long long> sum;
vector<long long> delay;
Node():sum(), delay(){ delay[]=; }
void relax() {
for(auto & x : sum) x%=MOD;
for(auto & x : delay) x%=MOD;
}
};
int n;
vector<Node> c;
SegmentTree(int _n):n(_n),c(_n<<){}
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
void deal(Node & o, pair<int, int> p, int range) {
auto & d=o.delay;
long long b1=p.second, b2=b1*b1, b3=b2*b1;
switch(p.first) {
case :
{
long long a1=o.sum[], a2=o.sum[];
o.sum[]+=*a1*b2+*a2*b1+b3*range;
o.sum[]+=*a1*b1+b2*range;
o.sum[]+=b1*range;
d[]+=b1;
break;
}
case :
o.sum[]*=b3;
o.sum[]*=b2;
o.sum[]*=b1;
d[]*=b1;
d[]*=b1;
break;
case :
o.sum[]=b3*range;
o.sum[]=b2*range;
o.sum[]=b1*range;
d[]=; d[]=;
d[]=b1;
break;
}
o.relax();
}
void pushDown(int l, int m, int r, int rt) {
for(int i=; i>=; --i) {
if(!c[rt].delay[i]) continue;
if(i== && c[rt].delay[i]==) continue;
deal(c[rt<<], {i, c[rt].delay[i]}, m-l+);
deal(c[rt<<|], {i, c[rt].delay[i]}, r-m);
}
c[rt].delay={, , };
}
void pushUp(int rt) {
for(int i=; i<; ++i) {
c[rt].sum[i]=(c[rt<<].sum[i]+c[rt<<|].sum[i])%MOD;
}
}
void update(int L, int R, pair<int, int> x, int l, int r, int rt) {
if(L<=l && r<=R) {
deal(c[rt], x, r-l+);
} else {
int m=(l+r)>>;
pushDown(l, m, r, rt);
if(L<=m) update(L, R, x, lson);
if(m<R) update(L, R, x, rson);
pushUp(rt);
}
}
int query(int L, int R, int x, int l, int r, int rt) {
if(L<=l && r<=R) {
return c[rt].sum[x];
} else {
int m=(l+r)>>;
pushDown(l, m, r, rt);
int ret=;
if(L<=m) ret=query(L, R, x, lson);
if(m<R) ret=(ret+query(L, R, x, rson))%MOD;
return ret;
}
}
}; int main() {
#ifndef ONLINE_JUDGE
freopen("in", "r", stdin);
freopen("out", "w", stdout);
#endif
int n, m;
while(scanf("%d%d", &n, &m), n||m) {
SegmentTree st(n);
while(m--) {
int op, a, b, c;
scanf("%d%d%d%d", &op, &a, &b, &c);
--a; --b;
// cout<<"<----------------->"<<endl;
if(op==) {
printf("%d\n", st.query(a, b, c-, , st.n-, ));
} else {
st.update(a, b, {op-, c}, , st.n-, );
}
}
}
return ;
}

hdu4578 Transformation的更多相关文章

  1. HDU-4578 Transformation(线段树的多种区间操作)

    http://acm.hdu.edu.cn/showproblem.php?pid=4578 Time Limit: 15000/8000 MS (Java/Others)    Memory Lim ...

  2. 【HDU4578 Transformation】线段树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 题意:有一个序列,有四种操作: 1:区间[l,r]内的数全部加c. 2:区间[l,r]内的数全部 ...

  3. HDU4578 Transformation 线段树

    这个题让我重新学习了加 乘 在区间的操作 题解:http://blog.csdn.net/guognib/article/details/25324025?utm_source=tuicool& ...

  4. HDU4578 Transformation【线段树】

    <题目链接> <转载于 >>> > 题目大意: 有一个序列,有四种操作: 1:区间[l,r]内的数全部加c. 2:区间[l,r]内的数全部乘c. 3:区间[l ...

  5. HDU4578 Transformation (多操作线段树)

    传送门 终于过了这道题.. 要注意标记之间的影响,和add操作时更新求和的顺序. same 区间每个数设置为x标记 mult  区间每个数乘x标记 add  区间每个数加x标记 ①:当打same标记时 ...

  6. HDU4578 Transformation(多标记线段树)题解

    题意: 操作有:\(1\).区间都加\(a\):\(2\).区间都乘\(a\):\(3\).区间都重置成\(a\):\(4\).询问区间幂次和\(\sum_{i=l}^rnum[i]^p(p\in\{ ...

  7. Transformation(线段树+HDU4578+多种操作+鬼畜的代码)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 题目: 题意:n个数初始值为0,进行四种操作:1.将区间内的数字加c:2.将区间内的数字乘c:3 ...

  8. (七)Transformation和action详解-Java&Python版Spark

    Transformation和action详解 视频教程: 1.优酷 2.YouTube 什么是算子 算子是RDD中定义的函数,可以对RDD中的数据进行转换和操作. 算子分类: 具体: 1.Value ...

  9. 线性分式变换(linear fractional transformation)

    线性分式变换(linear fractional transformation)的名称来源于其定义的形式:(ax+b)/(cx+d),其中分子分母是线性的,然后最外层是一个分式形式,所以叫做这个名字, ...

随机推荐

  1. git usage:常用git命令

    最近在改TV media相关的测试用例,需要在git上维护相关的脚本,把常用命令总结如下,方便以后使用. 1. 从已有git服务器上clone到本地, 首先进入用户根目录: cd ~ 然后进行clon ...

  2. 使用Starling 框架时,报错Error: Error #3669: 输入大小错误, 解决方案

    原因有二:1.IE底下,SWFOBJECT嵌入swf的时候,有瞬间的stage的width跟height是0导致的.2.stage.scaleMode = StageScaleMode.NO_SCAL ...

  3. Github-素材篇

    my github: http://github.com/yaochao

  4. Java多线程之并发协作生产者消费者设计模式

    两个线程一个生产者个一个消费者 需求情景 两个线程,一个负责生产,一个负责消费,生产者生产一个,消费者消费一个 涉及问题 同步问题:如何保证同一资源被多个线程并发访问时的完整性.常用的同步方法是采用标 ...

  5. C#正则表达式Regex类的用法

    C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:36891 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...

  6. Java内存浅析分类

    当jvm运行起来的时候,它会向系统申请一片内存区(不同的jvm实现可能不同,有些可以使用虚拟内存),并将这块内存分出一部分存储程序创建的对象,传递给方法的参数,返回值,局部变量等等,我们将这块内存称之 ...

  7. openlayers优化项

    做了一个简单的样式,但是做的不怎么样:希望和大家讨论下载动态图那里,怎么能够提高效率,提高数据,能够快速反应:一般的处理方法是什么?

  8. c++学习--面向对象一

    类与对象一 一 注意的点 1 利用构造函数给数据成员初始化的两种办法:1 赋值语句,2 用成员初始化列表 解释:1 成员初始化列表的一般形式为: 数据成员名1(初始值1),数据成员名2(初始值2) 2 ...

  9. vs2010 打包 SQL server compact 4.0 驱动程序

    sqlce 3.5应该是.net3.5环境下的.不知道最初的时候数据库的创建是用的3.5还是4.0 .这两天测试的时候,将4.0卸载了.就运行不上.报错为“未能加载文件或程序集“System.Data ...

  10. JAVA新手笔记 Intent对象和Bundle对象

    Intent对象和Bundle对象 功能主要是在 MainActivity中定义了2个EditText,当用户输入内容,把他传入到第二个活动, 自己新创的活动中,MyActivity中 放在MainA ...