lazytag記錄一下某個區間需要加的等差數列的首項和公差。由於區間長度已知(r-l+1),僅由此就可以推出這個區間每乙個數要加上的數。
可以發現兩個等差數列每一項相加,得到的還是等差數列,而且是首項和公差分別相加。
對於區間的分解(標記的下傳),要用等差數列通項/求和/求項數公式手算一下。由父區間應加上的首項和公差可以推出其子區間應加上的首項和公差,大概就是公差不變,兩個子區間的首項分別是父區間的首項和父區間數列的某一項(要推一下的)。
其實可以改成區間查詢的。
由於只需要單點查,有更簡單的方法:只記錄原數列的差分數列。
時間長原因:手算錯太多次/太慢
1 #include2 #include3#define ls (num<<1)
4#define rs (num<<1|1)
5#define mid ((l+r)>>1)
6 typedef long
long
ll;7 ll t[800100],kk[800100],dd[800100],a[200100];8
ll l,r,k,d,n,m;
9void
pushdown(ll l,ll r,ll num)
1021}22
void
build(ll l,ll r,ll num)
2329
build(l,mid,ls);
30 build(mid+1
,r,rs);
31 t[num]=t[ls]+t[rs];32}
33void
change(ll l,ll r,ll num)
3442
pushdown(l,r,num);
43if(l<=mid) change(l,mid,ls);
44if(mid1
,r,rs);
45 t[num]=t[ls]+t[rs];46}
47ll query(ll l,ll r,ll num)
4857
intmain()
5872
else
7377}78
return0;
79 }
洛谷 P1438 無聊的數列
題目背景 無聊的yyb總喜歡搞出一些正常人無法搞出的東西。有一天,無聊的yyb想出了一道無聊的題 無聊的數列。k峰 這題不是傻x題嗎 題目描述 維護乙個數列,支援兩種操作 1 1 l r k d 給出乙個長度等於r l 1的等差數列,首項為k,公差為d,並將它對應加到a l a r 的每乙個數上。即...
洛谷 P1438 無聊的數列
1 多次對於區間加上乙個等差數列,引數為l,r,k,d,表示首項為k,公差為d,將乙個長度r l 1的等差數列加到區間l.r上 2 詢問乙個值a i 要加上乙個等差數列,很容易想到差分,因此將題目簡化至下 1 將a l 加上k 2 將a l 1.r 加上d 3 將a r 1 r l d k 而查詢的...
洛谷 P1438 無聊的數列
p1438 無聊的數列 題目背景 無聊的yyb總喜歡搞出一些正常人無法搞出的東西。有一天,無聊的yyb想出了一道無聊的題 無聊的數列。k峰 這題不是傻x題嗎 題目描述 維護乙個數列,支援兩種操作 1 1 l r k d 給出乙個長度等於r l 1的等差數列,首項為k,公差為d,並將它對應加到a l ...