裸的线段树

/**************************************************************
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. 【个人训练】(UVa146)ID Codes

    题意与解析 这题其实特别简单,求给定排列的后继.使用stl(next_permutation)可以方便地解决这个问题.但是,想要自己动手解就是另外一回事了.我的解法是从后往前找到第一个$a_i$比$a ...

  2. nmon Analyser分析仪

    nmon Analyser官网: https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Power+System ...

  3. 【转】ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    原文链接:https://www.cnblogs.com/yilezhu/p/9241261.html 引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必 ...

  4. Windows Server 2008 R2(x64) IIS7+PHP5(FastCGI)环境搭建

    相关软件下载: 1.PHP下载地址: http://windows.php.net/downloads/releases/php-5.4.4-nts-Win32-VC9-x86.zip 如果是win2 ...

  5. 《机器学习实战》 in python3.x

    机器学习实战这本书是在python2.x的环境下写的,而python3.x中好多函数和2.x中的名称或使用方法都不一样了,因此对原书中的内容需要校正,下面简单的记录一下学习过程中fix的部分 1.pr ...

  6. c++知识点总结--函数模板

    通用函数可变参模板 用于处理不限定参数的函数 showall(){//空函数,接口,最后结束递归 } template<typename T,typename... Args> void ...

  7. 完整Android开发基础入门博客专栏

    博客地址:http://www.runoob.com/w3cnote/android-tutorial-contents.html

  8. Xampp+Openfire+Spark的简单使用

    Openfire与Spark的简单实用 1.安装Openfire 百度云 提取码:uu11 2.查找路径 /usr/local/openfire 这时候需要将openfire的文件属性都设置为 可读可 ...

  9. NIO--2-代码

    package com.study.nio; import java.io.IOException; import java.net.InetSocketAddress; import java.ni ...

  10. media="screen"是什么意思?

    <link rel="stylesheet" href="css/main.css" type="text/css" media=&q ...