裸的线段树

/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/ //By BLADEVIL
type
rec =record
left, right :longint;
sum, lazy :int64;
end; var
n, m :longint;
a :array[..] of int64;
t :array[..] of rec; procedure swap(var a,b:longint);
var
c :longint;
begin
c:=a; a:=b; b:=c;
end; procedure build(x,l,r:longint);
var
mid :longint;
begin
t[x].left:=l; t[x].right:=r;
if l=r then
begin
t[x].sum:=a[l];
exit;
end;
with t[x] do mid:=(l+r)>>;
build(*x,l,mid); build(*x+,mid+,r);
t[x].sum:=(t[*x].sum+t[*x+].sum);
end; procedure change(x,l,r:longint;y:int64);
var
mid :longint;
begin
if t[x].lazy<> then
begin
t[*x].sum:=t[*x].sum+t[x].lazy*(t[*x].right-t[*x].left+);
t[*x].lazy:=t[*x].lazy+t[x].lazy;
t[*x+].sum:=t[*x+].sum+t[x].lazy*(t[*x+].right-t[*x+].left+);
t[*x+].lazy:=t[*x+].lazy+t[x].lazy;
t[x].lazy:=;
end; if (t[x].left=l) and (t[x].right=r) then
begin
t[x].lazy:=y;
t[x].sum:=t[x].sum+y*(t[x].right-t[x].left+);
exit;
end;
with t[x] do mid:=(left+right)>>;
if mid<l then change(*x+,l,r,y) else
if mid>=r then change(*x,l,r,y) else
begin
change(*x,l,mid,y);
change(*x+,mid+,r,y);
end;
t[x].sum:=t[*x].sum+t[*x+].sum;
end; function ask(x,l,r:longint):int64;
var
mid :longint;
begin
if t[x].lazy<> then
begin
t[*x].sum:=t[*x].sum+t[x].lazy*(t[*x].right-t[*x].left+);
t[*x].lazy:=t[*x].lazy+t[x].lazy;
t[*x+].sum:=t[*x+].sum+t[x].lazy*(t[*x+].right-t[*x+].left+);
t[*x+].lazy:=t[*x+].lazy+t[x].lazy;
t[x].lazy:=;
end; if (t[x].left=l) and (t[x].right=r) then exit(t[x].sum); with t[x] do mid:=(left+right)>>;
if mid<l then exit(ask(*x+,l,r)) else
if mid>=r then exit(ask(*x,l,r)) else
exit(ask(*x,l,mid)+ask(*x+,mid+,r));
end; procedure init;
var
i :longint;
begin
readln(n,m);
for i:= to n do read(a[i]);
readln;
build(,,n);
end; procedure main;
var
i :longint;
ch :char;
l, r :longint;
x :int64;
begin
for i:= to m do
begin
read(ch);
if ch='C' then
begin
readln(l,r,x);
if l>r then swap(l,r);
change(,l,r,x);
end else
begin
readln(l,r);
if l>r then swap(l,r);
writeln(ask(,l,r));
end;
end;
end; begin
init;
main;
end.

bzoj 3212 线段树的更多相关文章

  1. BZOJ 1798 (线段树||分块)的标记合并

    我原来准备做方差的.. 结果发现不会维护两个标记.. 就是操作变成一个 a*x+b ,每次维护a , b 即可 加的时候a=1 ,b=v 乘的时候a=v ,b=0 #include <cstdi ...

  2. bzoj 3999 线段树区间提取 有序链剖

    看错题目了,想成每个城市都可以买一个东西,然后在后面的某个城市卖掉,问最大收益.这个可以类似维护上升序列的方法在O(nlog^3n)的时间复杂度内搞定 这道题用到的一些方法: 1. 可以将有关的线段提 ...

  3. bzoj 3211 线段树

    开方操作最多进行5次就可以把出现的任何数变成1. 所以用线段树暴力修改,以后修改时只需看一下是否当前区间都是0或1,如果是那么就直接返回. /***************************** ...

  4. bzoj 1018 线段树维护连通性

    本题将一道LCT的题特殊化(支持加边和删边,询问图的连通性),将图变成了2×m的网格图,然后就神奇地可以用线段树来维护. 对于每个区间[l,r],维护其四个角落之间的连通性(仅仅通过[l,r]这段的边 ...

  5. bzoj 2120 线段树套平衡树

    先吐下槽,改了快一个小时,最后发现是SBT的delete写错了,顿时就有想死的心..... 首先对于这道题,我们应该先做一下他的小问题,bzoj1878,虽然和这道题几乎一点关系没有, 但是能给我们一 ...

  6. bzoj 1901 线段树套平衡树+二分答案查询

    我们就建一颗线段树,线段树的每一个节点都是一颗平衡树,对于每个询问来说,我们就二分答案, 查询每个二分到的mid在这个区间里的rank,然后就行了 /************************* ...

  7. BZOJ 1012 线段树||单调队列

    非常裸的线段树  || 单调队列: 假设一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然不管在如何的情况下都不会被选为最大值. 既然它仅仅在末尾选.那么自然能够满足以上的条件 ...

  8. BZOJ 3681 线段树合并+网络流

    思路: 暴力建图有n*m条边 考虑怎么优化 (那就只能加个线段树了呗) 然后我就不会写了..... 抄了一波题解 //By SiriusRen #include <bits/stdc++.h&g ...

  9. BZOJ 4756 线段树合并(线段树)

    思路: 1.最裸的线段树合并 2. 我们可以观察到子树求一个东西 那我们直接DFS序好了 入队的时候统计一下有多少比他大的 出的时候统计一下 减一下 搞定~ 线段树合并代码: //By SiriusR ...

随机推荐

  1. lessJs

    lessJs下载地址 ======== 简介 lessJs主要提供页面切换,页面管理的一个框架:less-ui.css 和 less-ui.js 是独立于less.js的,他们提供的是一组ui,包括消 ...

  2. 最火的.NET开源项目[转]

    综合类 微软企业库 微软官方出品,是为了协助开发商解决企业级应用开发过程中所面临的一系列共性的问题, 如安全(Security).日志(Logging).数据访问(Data Access).配置管理( ...

  3. Python 3基础教程29-os模块

    本文介绍os模块,主要是介绍一些文件的相关操作. 你还有其他方法去查看os 1. help() 然后输入os 2. Python接口文档,前面提到的用浏览器打开的,os文件路径为:C:\Users\A ...

  4. Loadrunner11.0安装与简单使用

    公司开发了APP或者微信小程序啊什么的,都会先进行性能测试,而性能测试一般肯定会来测试接口的压测,并发.Loadrunner是一个很强大的测试工具,它是一种预测系统行为和性能的负载测试工具.通过以模拟 ...

  5. Python网络编程(基础总结、 入门经典)

    Linux下文件类型:     bcd -lsp          b(块.设备文件)          c(字符设备文件)          d(目录)          -(普通文件)       ...

  6. 12-Mysql数据库----多表查询

    本节重点: 多表连接查询 符合条件连接查询 子查询 准备工作:准备两张表,部门表(department).员工表(employee) create table department( id int, ...

  7. PHP实现字节数Byte转换为KB、MB、GB、TB

    function getFilesize($num) { $p = 0; $format = 'bytes'; if( $num > 0 && $num < 1024 ) ...

  8. 3.爬虫 urlib库讲解 总结

    urllib库的总结: 用ProcessOn(安利这个软件,够用了)根据前面的几节内容做了个思维导图. urllib库一共有四个模块: request:它是最基本的模块,可以用来模拟发送请求 erro ...

  9. 【iOS开发】IOS界面开发使用viewWithTag:(int)findTag方法获取界面元素

    http://blog.csdn.net/lxp1021/article/details/43952551 今天在开发OS界面的时候,遇到通过界面UIview viewWithTag:(int)fin ...

  10. iOS-SDWebImage的原理以及使用流程

    SDWebImage 支持异步的图片下载+缓存,提供了 UIImageView+WebCacha 的 category,方便使用.SDWebImage加载图片的流程: 1. 入口 setImageWi ...