和普通的线段树不同的是,查询x~y的话,给出的答案是第一个值的一倍加上第二个值的两倍一直到第n个值的n倍。

  思路的话,就是关于query和pushup的方法。用一个新的变量sum记录一下这个区间里面按照答案给出的方式的值,比如说,这个节点的区间是1~3,那么这个节点的sum值就是(1*val[1]+2*val[2]+3*val[3])。那么对于pushup操作,当前这个节点的sum值是左边的sum值+左边的区间长度*右边的c值(c值代表的是这个区间的所有元素的和)+右边的sum值。这样的话就相当于右边的sum升高了需要的高度,就满足题意了。

  另外关于query也是类似,要返回时,加上(l-ql)倍的c[o]的值就行了,这样就相当于右边的sum升高了(l-ql)的高度了。如果不能理解,可以手动模拟一下试试。

  但是这题WA了好多次,,因为我现在才知道原来uva的long long得用lld,QAQ。。。

  具体见代码:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#define t_mid (l+r>>1)
#define ls o<<1
#define rs o<<1 | 1
#define lson ls,l,t_mid
#define rson rs,t_mid+1,r
using namespace std;
typedef long long ll; const int N = + ;
ll c[N<<],sum[N<<],add[N<<]; void pushup(int o,int len){c[o]=c[ls]+c[rs];sum[o]=sum[ls]+c[rs]*len+sum[rs];} void build(int o,int l,int r)
{
add[o]=;
if(l==r) {c[o]=sum[o]=;return;}
build(lson);
build(rson);
pushup(o,t_mid-l+);
} void pushdown(int o,int len)
{
if(add[o])
{
int llen=(len-(len>>)),rlen=(len>>);
add[ls] += add[o];
add[rs] += add[o];
c[ls] += add[o]*llen;
c[rs] += add[o]*rlen;
sum[ls] += add[o]*(llen)*(llen+)/;
sum[rs] += add[o]*(rlen)*(rlen+)/;
add[o]=;
}
} void update(int o,int l,int r,int ql,int qr,int dt)
{
if(ql <= l && qr >= r)
{
add[o] += (ll)dt;
c[o] += (ll)dt*(r-l+);
sum[o] += (ll)dt*(r-l+)*(r-l+)/;
return;
}
pushdown(o,r-l+);
if(ql <= t_mid) update(lson,ql,qr,dt);
if(qr >t_mid) update(rson,ql,qr,dt);
pushup(o,t_mid-l+);
} ll query(int o,int l,int r,int ql,int qr)
{
if(ql <= l && qr >= r)
{
return (l-ql)*c[o]+sum[o];
}
pushdown(o,r-l+);
ll res = ;
if(ql <= t_mid) res += query(lson,ql,qr);
if(qr > t_mid) res += query(rson,ql,qr);
return res;
} int main()
{
int T;
scanf("%d",&T);
for(int kase=;kase<=T;kase++)
{
printf("Case %d:\n",kase);
int n,m;
scanf("%d%d",&n,&m);
build(,,n); while(m--)
{
char s[];
scanf("%s",s);
if(s[]=='c')
{
int x,y,dt;
scanf("%d%d%d",&x,&y,&dt);
update(,,n,x,y,dt);
}
else
{
int x,y;
scanf("%d%d",&x,&y);
printf("%lld\n",query(,,n,x,y));
}
}
}
}

UVA 12501 Bulky process of bulk reduction ——(线段树成段更新)的更多相关文章

  1. ACM: Copying Data 线段树-成段更新-解题报告

    Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description W ...

  2. Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

    题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题 ...

  3. POJ 2777 Count Color (线段树成段更新+二进制思维)

    题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...

  4. hdu 4747【线段树-成段更新】.cpp

    题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...

  5. HDU1698_Just a Hook(线段树/成段更新)

    解题报告 题意: 原本区间1到n都是1,区间成段改变成一个值,求最后区间1到n的和. 思路: 线段树成段更新,区间去和. #include <iostream> #include < ...

  6. HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )

    线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...

  7. poj 3468 A Simple Problem with Integers 【线段树-成段更新】

    题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...

  8. POJ3468_A Simple Problem with Integers(线段树/成段更新)

    解题报告 题意: 略 思路: 线段树成段更新,区间求和. #include <iostream> #include <cstring> #include <cstdio& ...

  9. poj 3648 线段树成段更新

    线段树成段更新需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候.延迟标记的意思是:这个区间的左右儿子都需要被更新,但是当 ...

随机推荐

  1. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by de

    MySQL在高版本需要指明是否进行SSL连接 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/framework?characterEncoding ...

  2. MQTT协议探究(二)

    1 回顾与本次目标 1.1 回顾 MQTT控制报文的基本格式 WireShark进行抓包分析了报文 报文分析: CONNECT--连接服务器 CONNACK--确认连接请求 PINGREQ--心跳请求 ...

  3. winForm入门学习

    Windows窗体 属性: name:对象的名称 windowsState:初始化窗体的大小,Normal,Minimized,Maximized StartPosition:窗体起始位置,Manua ...

  4. ADO与达梦7产生的一个未知问题

    采用OLEDB与达梦7建立数据库连接 连接成功 查询表成功 打开表成功 当进行到addnew 操作时  报异常,未知错误 而且是仅针对这张表 ,其他表都没有问题 当清空数据后可以再插入一次数据,之后就 ...

  5. php 如何将image图片转化为字符串(GD库操作及imagick两种实现方式)

    前两天研究php中的 imagick 扩展的时候,突发奇想实现的一个小功能感觉挺有意思,在这里记录一下: 将一张image图片转化为字符串的形式,先上一张效果图.(运行笔记中的代码需要先安装 php_ ...

  6. 使用高德地图JS获取当前位置和经纬度

    先看效果,我做的是这样的,可以按地图位置来返回当前你点的位置(图一,二),也可以根据输入框的自动搜索(图三,四) HTML的代码: <div> <input type="t ...

  7. 使用2种python脚本工具将2个txt文档中的文字进行比较,并计算出Corr, WER正确率,准确率

    一.准备: linux服务器,src2mlf.py   rec2mlf.py   HResults文件,1份源文件和1份需要对比的文件.文件放置于本人云盘 二.使用方法: 1. 对比工具 HResul ...

  8. Spring注解实践

    原文:http://blog.csdn.net/xyh820/article/details/7303330 概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获 ...

  9. DICOM文件修改方法

    /// <summary> /// 读取dicom文件 /// </summary> /// <param name="srcdirectory"&g ...

  10. explicit和implicit

    explicit是C++中的一个关键字,只用于修饰只有一个参数的构造函数: class A{ explicit A(const T obj); }; 该关键字告诉编译器该类只能显式的转换,不能隐式(i ...