UVA 12501 Bulky process of bulk reduction ——(线段树成段更新)
和普通的线段树不同的是,查询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 ——(线段树成段更新)的更多相关文章
- ACM: Copying Data 线段树-成段更新-解题报告
Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description W ...
- 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. 这题 ...
- POJ 2777 Count Color (线段树成段更新+二进制思维)
题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...
- hdu 4747【线段树-成段更新】.cpp
题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...
- HDU1698_Just a Hook(线段树/成段更新)
解题报告 题意: 原本区间1到n都是1,区间成段改变成一个值,求最后区间1到n的和. 思路: 线段树成段更新,区间去和. #include <iostream> #include < ...
- HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )
线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...
- poj 3468 A Simple Problem with Integers 【线段树-成段更新】
题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...
- POJ3468_A Simple Problem with Integers(线段树/成段更新)
解题报告 题意: 略 思路: 线段树成段更新,区间求和. #include <iostream> #include <cstring> #include <cstdio& ...
- poj 3648 线段树成段更新
线段树成段更新需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候.延迟标记的意思是:这个区间的左右儿子都需要被更新,但是当 ...
随机推荐
- docker 入门6 - 部署 【翻译】
开始,第 6 部分:部署应用 先决条件 安装 Docker. 获取第 3 部分先决条件中所述的 Docker Compose. 获取 Docker Machine,如第 4 部分先决条件中所述. 阅读 ...
- MVC全局过滤器
Asp.NET MVC4中的全局过滤器,可以对整个项目进行全局监控. 新建一个MVC4项目,可以在global.asax文件中看到如下代码: FilterConfig.RegisterGlobalF ...
- vue添加图片
首先开始创建一个 static 文件夹用来保存图片 去 setting 里面进行配置 MEDIA_ROOT = os.path.join(BASE_DIR,'media') #前面大写的是死格式,尽量 ...
- 在Windows中 , 如何用leakdiag “自动”检测内存泄露 (自动记录日志)
一.基本用法 在LeakDiag中选择aaa.exe 然后选择Windows Heap Allocator来跟踪heap的使用,按start开始,等一会按log,然后再stop 会在c:\leakdi ...
- js面向对象的几种方式
对象的字面量 var obj={}:创建实例对象 var obj=new Object();构造函数模式 function fn(){}, new fn();工厂模式:用一个函数,通过传递参数返回对象 ...
- MFC基础笔记
List Control // List Control初始化,下面代码需要放在OnInitDialog()函数里面// 设置扩展风格:正行选中 m_list.SetExtendedStyle(LVS ...
- nodejs request module里的json参数的一个坑
今天工作的时候遇到一个坑,在客户端用nodejs给服务器发送HTTP请求,服务器老是报错:In the context of Data Services an unknown internal ser ...
- java程序启动极慢的问题处理
在程序部署过程中,遇到一次java程序启动极慢的情况 参考:https://www.iteye.com/blog/windshome-1836885 原部署环境是有外网的,启动java极快 后来极其修 ...
- Image Processing and Analysis_8_Edge Detection:Theory of Edge Detection ——1980
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- Windows Ping | Tracert 's Bat 脚本并行测试
系统:windows 需求:测试多台PC输出三个网站并行ping.tracert结果,多台PC同时进行. 说明:以www.baidu.com.www.sina.com.cn.www.tencent.c ...