提交 121.16k
通過 48.14k
時間限制 1.00s
記憶體限制 125.00mb
提交答案
加入收藏
難度 普及/提高-
歷史分數 100
提交記錄
檢視題解
高效能進入討論版
如題,已知乙個數列,你需要進行下面兩種操作:
將某區間每乙個數加上 kk。
求出某區間每乙個數的和。
第一行包含兩個整數 n, mn,m,分別表示該數列數字的個數和操作的總個數。
第二行包含 nn 個用空格分隔的整數,其中第 ii 個數字表示數列第 ii 項的初始值。
接下來 mm 行每行包含 33 或 44 個整數,表示乙個操作,具體如下:
1 x y k
:將區間 [x, y][x,y] 內每個數加上 kk。
2 x y
:輸出區間 [x, y][x,y] 內每個數的和。
輸出包含若干行整數,即為所有操作 2 的結果。
輸入 #1複製
551輸出 #1複製5423
2241
2322
3411
5121
4
11對於 30% 的資料:n≤8,m≤10。820
對於 70% 的資料:n≤103
,m≤104
。對於 100% 的資料:1≤n,m≤105
。保證任意時刻數列中任意元素的和在 [-263, 263)內。
【樣例解釋】
不多說了,線段樹板子題。
#include usingnamespace
std;
const
int maxn = 1000090
;long
long
nums[maxn];
long
long
totn;
long
long
totdo;
bool
tempquest;
struct
node
inline
void
push_up()
inline
void
push_down()
else
if (rch ==null)
lch->maketag(tag);
rch->maketag(tag);
tag = 0
; }
}node(
const
long
long l, const
long
long
r)
else
}inline
bool in_range(const
long
long l, const
long
long
r)
inline
bool out_of_range(const
long
long l, const
long
long
r)
inline
void update(const
long
long l, const
long
long r, const
long
long
w)
else
if (!out_of_range(l, r))
}inline
long
long quest_range_sum(const
long
long l, const
long
long
r)
else
}push_down();
return lch->quest_range_sum(l, r) + rch->quest_range_sum(l, r);
}};inline
long
long
read()
while (ch >= '
0' && ch <= '9'
)
return x *f;
}void write(const
long
long&x)
long
long s = 0
;
while (tmp > 0
)
while (s > 0
)
}int
main()
node* root = new node(1
, totn);
for (int i = 1; i <= totdo; i++)
else
}return0;
}//likiblaze code
P3372 模板 線段樹 1
線段樹學習 這個題來看,線段樹分為建樹,更新,查詢。1.建樹 void build ll p,ll l,ll r ll mid l r 1 build lson p l,mid build rson p mid 1,r push up sum p void push up sum ll p 這段 的...
P3372 模板 線段樹 1
題 include includeusing namespace std typedef long long ll ll n,m,ans,x,y,op,val 因為下面有的函式需要用到x,y,val值,懶得傳參,故直接寫為全域性變數 const int n 100000 struct nodetre...
P3372 模板 線段樹 1
題目描述 如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 輸入輸出格式 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個整數...