題意:
對於乙個陣列 a[]
aa[
],現在有兩個操作:
思路:操作一:因為對於乙個區間 [l,r]
[l,r]
[l,r
], 在第 l
ll 位上加上 k
kk ,在區間 (l,
r]
(l, r]
(l,r
] 上加上 d
dd ,再在第 r+1
r+1r+
1 位上加上 −(k
+(r−
l)∗d
)-(k + (r - l) * d)
−(k+(r
−l)∗
d)。這樣對於陣列每一位上的修改就是對應的區間 [1,
i]
[1,i]
[1,i
] 的字首和,再加上陣列原來的值就是答案。
**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define fi first
#define se second
//#include
//#include
//srand((unsigned)time(null));
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
int inf =
0x3f3f3f3f
;using
namespace std;
const
int n =
2e6+10;
int a[n]
;int n, m;
#define ls (rt << 1)
#define rs ((rt << 1) | 1)
int tr[n]
, lz[n]
;void
build
(int l,
int r,
int rt)
int mid =
(l + r)
>>1;
build
(l, mid, ls)
;build
(mid +
1, r, rs)
; tr[rt]
= tr[ls]
+ tr[rs];}
void
pushdown
(int l,
int r,
int rt)
}int
query
(int s,
int t,
int l,
int r,
int rt)
void
modify
(int s,
int t,
int l,
int r,
int rt,
int v)
int mid =
(l + r)
>>1;
pushdown
(l, r, rt);if
(s <= mid)
modify
(s, t, l, mid, ls, v);if
(mid < t)
modify
(s, t, mid +
1, r, rs, v)
; tr[rt]
= tr[ls]
+ tr[rs];}
intmain()
build(1
, n,1)
;while
(m--
)else
if(opt ==2)
}return0;
}
luogu P1438 無聊的數列
區間 l 到 r 內加等差數列 已知首項為 k 公差為 d 那麼每一位加的數值為 k i l d l i r k i d l d l i r k l d i d l i r 我們可以分別加一下 k l d 和 i d 前者可以算出來,直接區間加就可以 後者的話,先維護一下 l,r 內的下標和 結合律...
luogu P1438 無聊的數列 差分 線段樹
題目描述 維護乙個數列 a i 支援兩種操作 1 l r k d 給出乙個長度等於 r l 1 的等差數列,首項為 k 公差為 d 並將它對應加到 l,r 範圍中的每乙個數上。即 令 a l a l k,a a k d ldots a r a r k r l times 2 p 詢問序列的第 p 個...
P1438 無聊的數列
板子題 按照ppt所說的,預留0號位和n 1號位,0號位位於2的若干次方的位置。但是我試了一下。沒有嚴格要求的這樣的寫法,這題也能a,資料有點水。include include include include include include include include include inclu...