p1438 無聊的數列
題目背景
無聊的yyb總喜歡搞出一些正常人無法搞出的東西。有一天,無聊的yyb想出了一道無聊的題:無聊的數列。。。(k峰:這題不是傻x題嗎)
題目描述
維護乙個數列,支援兩種操作:
1、1 l r k d:給出乙個長度等於r-l+1的等差數列,首項為k,公差為d,並將它對應加到a[l]~a[r]的每乙個數上。即:令a[l]=a[l]+k,a[l+1]=a[l+1]+k+d,
a[l+2]=a[l+2]+k+2d……a[r]=a[r]+k+(r-l)d。
2、2 p:詢問序列的第p個數的值a[p]。
輸入格式:
第一行兩個整數數n,m,表示數列長度和操作個數。
第二行n個整數,第i個數表示a[i](i=1,2,3…,n)。
接下來的m行,表示m個操作,有兩種形式:
1 l r k d
2 p 字母意義見描述(l≤r)。
輸出格式:
對於每個詢問,輸出答案,每個答案佔一行。
輸入樣例:
5 2
1 2 3 4 5
1 2 4 1 2
2 3
輸出樣例:
6 說明
資料規模:
0≤n,m≤100000
|a[i]|,|k|,|d|≤200
hint:
有沒有巧妙的做法?
題解
作者比較菜,不知道到什麼是差分……
但是發現等差數列扣去k,那麼剩下的就是0,d,2d,3d……
這個東西讓我想到了字首和,所以,對於 l 到 r 段的修正,分成兩部分。
第一部分是前面的 k。
第二個部分是0,d,2d,3d……
第一部分直接用樹狀陣列維護(詳解部分,懂的跳過。在l的位置增加d,r+1的位置 -d 再刷趟字首和,就會發現l到r這段都修正成了d)
第二部分,我們可以用線段樹維護(詳解部分,懂的跳過。與前面同理,l+1到r每個增加d,刷字首和,l到r這段就是…區間修改就想到線段樹,詳見**)
當然,洛谷部落格裡也有很多別的解法和寫得更好的**傳送門
**
#include
#define ll long long
const int maxn=100005;
int n,m,rot,tot;
struct nod
}a[maxn<<2];
ll c[maxn];
int read()
while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}void add(int x,int y)
ll get(int x)
int build(int l,int r)//建樹
void pushdown(nod &x,int l,int r)//lazy標記下推
void addtre(int x,int l,int r,int le,int ri,int y)//修正某段權值
pushdown(a[x],le,ri);
if (rir) return;
int mid=le+ri>>1;
if (l<=mid) addtre(a[x].l,l,r,le,mid,y);
if (mid+1
<=r) addtre(a[x].r,l,r,mid+1,ri,y);
a[x].sum=a[a[x].l].sum+a[a[x].r].sum;
}ll gettre(int x,int l,int r,int le,int ri)//查詢某段權值
if (rir) return
0; int mid=le+ri>>1;ll sum=0;
if (l<=mid) sum+=gettre(a[x].l,l,r,le,mid);
if (mid+1
<=r) sum+=gettre(a[x].r,l,r,mid+1,ri);
return
sum;
}int main()
else
}return
0;}
洛谷 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 無聊的數列
lazytag記錄一下某個區間需要加的等差數列的首項和公差。由於區間長度已知 r l 1 僅由此就可以推出這個區間每乙個數要加上的數。可以發現兩個等差數列每一項相加,得到的還是等差數列,而且是首項和公差分別相加。對於區間的分解 標記的下傳 要用等差數列通項 求和 求項數公式手算一下。由父區間應加上的...