一開始嚇死,給區間加上乙個等差數列???
然後就發現我們只要維護題目裡說的k,d兩個之就好了;
比如我讀入是1,x,y,k,d;
那麼對於在x~y這個區間裡面的小區間l~r
小區間的k,d值相應就是
k』=k+d*(l-x);
d』=d;
這個很顯然把;
換句話說,x~y變成乙個等差序列,那麼對於i小區間l~r顯然也是乙個等差序列;
那麼直接線段樹好了;
比什麼毒瘤資料題好多了;
然後洛谷資料有毒;
#include
#include
#include
#include
#include
using
namespace
std;
struct treet[262144];
int a[100005];
int n,m,x,y,z,k,d;
void maketree(int l,int r,int num)
void init(int num)
num=num<<1;
if(t[num ].r>=x)init(num );
if(t[num+1].l<=y)init(num+1);
}int outit(int num)
int main()
else
}}
洛谷題解還有乙個非常妙的思路;
實際上可以維護乙個差分陣列,不需要進行複雜的計算只需要寫乙個很普通的滋磁區間加法和區間求和的線段樹就可以了
1操作可以轉化為如下操作:
將a[l]在差分陣列中的對應值d[l]加上k
將a[l+1]至a[r]在差分陣列中的對應值加上d
將a[r+1]對應的d[r+1]減去k+d*(r-l),即減去數列的末項
2操作即在差分陣列中求d[1]至d[p]的和
洛谷 線段樹 P1438 無聊的數列
無聊的yyb總喜歡搞出一些正常人無法搞出的東西。有一天,無聊的yyb想出了一道無聊的題 無聊的數列。k峰 這題不是傻x題嗎 維護乙個數列,支援兩種操作 1 1 l r k d 給出乙個長度等於r l 1的等差數列,首項為k,公差為d,並將它對應加到a l a r 的每乙個數上。即 令a l a l ...
洛谷P1438 無聊的數列 zkw線段樹
題目傳送門 無聊的yyb總喜歡搞出一些正常人無法搞出的東西。有一天,無聊的yyb想出了一道無聊的題 無聊的數列。k峰 這題不是傻x題嗎 維護乙個數列,支援兩種操作 1 1 l r k d 給出乙個長度等於r l 1的等差數列,首項為k,公差為d,並將它對應加到a l a r 的每乙個數上。即 令a ...
洛谷 P1438 無聊的數列
題目背景 無聊的yyb總喜歡搞出一些正常人無法搞出的東西。有一天,無聊的yyb想出了一道無聊的題 無聊的數列。k峰 這題不是傻x題嗎 題目描述 維護乙個數列,支援兩種操作 1 1 l r k d 給出乙個長度等於r l 1的等差數列,首項為k,公差為d,並將它對應加到a l a r 的每乙個數上。即...