和普通的线段树不同的是,查询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));
}
}
}
}

最新文章

  1. Juniper SSG5 PPTP VPN 619错误解决
  2. Jmeter发送Java请求
  3. springboot之filter/listener/servlet
  4. (十)WebGIS中地理坐标与屏幕坐标间的转换原理
  5. 浅谈Java中的对象和引用
  6. ReSharper 配置及用法
  7. sed字符串替换
  8. 服务器租用中网络ping值过高的原因
  9. iOS开发——运行时OC篇&amp;使用运行时获取系统的属性:使用自己的手势修改系统自带的手势
  10. 记录ConcurrentHashMap的锁分离技术
  11. JBOSS的安全配置 .
  12. [转载] 文件系统vs对象存储——选型和趋势
  13. 都是iconv惹的祸
  14. 【转】OFBiz安全组
  15. MantisBT
  16. .net 实现注册邮箱验证激活
  17. c#简单的调试信息、日志信息输出
  18. Java 字符终端上获取输入三种方式
  19. socket.io的websocket示例
  20. [leetcode]52. N-Queens II N皇后

热门文章

  1. [Tarjan系列] Tarjan算法求无向图的双连通分量
  2. Kirinriki 2017多校
  3. 3-MySQL DBA笔记-开发基础
  4. mybatis基础小结
  5. css样式背景图片设置缩放
  6. 【Distributed】CDN
  7. 轻量化模型之MobileNet系列
  8. 在线p图网址
  9. CentOS7 内核优化 修改参数
  10. [译] 优化 WEBPACK 以更快地构建 REACT