Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
range_arithmetic_add.hpp
[詳解]
1#include"../../kyopro_library/template.hpp"
2
3/// @brief 区間等差数列加算(オフライン)
4/// @brief 長さ n の数列に対する区間等差数列加算クエリを処理する
5/// @brief クエリは `(l, r, start, step)` の形式で与える
6/// @note O(N)
7/// @ref verify: https://mojacoder.app/users/Today03/problems/range_arithmetic_add
8/// @ref verify: https://atcoder.jp/contests/abc407/tasks/abc407_f
9vector<ll> RangeArithmeticAdd(int n, vector<tuple<ll,ll,ll,ll>> query) {
10 vector<ll> i1(n+10),i2(n+10);
11
12 for(auto [l,r,start,step]:query) {
13 i1[l+1]+=step; i1[r]-=step;
14 i1[r]-=step*(r-l-1); i1[r+1]+=step*(r-l-1);
15 i2[l]+=start; i2[r]-=start;
16 }
17
18 for(int i=0; i<n+5; i++) i1[i+1]+=i1[i], i2[i+1]+=i2[i];
19
20 vector<ll> ret(n);
21 for(int i=0; i<n-1; i++) ret[i+1]=ret[i]+i1[i+1];
22 for(int i=0; i<n; i++) ret[i]+=i2[i];
23
24 return ret;
25}
vector< ll > RangeArithmeticAdd(int n, vector< tuple< ll, ll, ll, ll > > query)
区間等差数列加算(オフライン)