洛谷P1438 無聊的數列 線段樹,差分

2021-08-25 10:59:19 字數 2068 閱讀 1857

題目背景

無聊的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)。

輸出格式:

對於每個詢問,輸出答案,每個答案佔一行。

輸入輸出樣例

輸入樣例#1:

5 2

1 2 3 4 5

1 2 4 1 2

2 3輸出樣例#1:

6說明

資料規模:

0≤n,m≤100000

|a[i]|,|k|,|d|≤200

分析:將原陣列差分之後就變成了區間修改和區間查詢,對於乙個等差數列,進行如下操作:

1、區間[l,l]+k

2、區間[l+1,r]+d

3、區間[r+1,r+1]-k+(r-l)*d

**

#include 

#define n 1000000

using namespace std;

struct tree

tr[n];

int a[n],b[n],n,m,ans;

void build(int p)

int mid = (tr[p].l + tr[p].r) / 2;

tr[p * 2].l = tr[p].l;

tr[p * 2].r = mid;

tr[p * 2 + 1].l = mid + 1;

tr[p * 2 + 1].r = tr[p].r;

build(p * 2);

build(p * 2 + 1);

tr[p].sum = tr[p * 2].sum + tr[p * 2 + 1].sum;

}void down(int p)

}void change(int p, int

x, int

y, int val)

down(p);

int mid = (tr[p].l + tr[p].r) / 2;

if (y

<= mid) change(p * 2, x, y, val);

else

if (x > mid) change(p * 2 + 1, x, y, val);

else change(p * 2, x, mid, val), change(p * 2 + 1, mid + 1, y, val);

tr[p].sum = tr[p * 2].sum + tr[p * 2 + 1].sum;

}void count(int p, int

x, int

y) down(p);

int mid = (tr[p].l + tr[p].r) / 2;

if (y

<= mid) count(p * 2, x, y);

else

if (x > mid) count(p * 2 + 1, x, y);

else count(p * 2, x, mid), count(p * 2 + 1, mid + 1, y);

}int main()

tr[1].l = 1;

tr[1].r = n;

build(1);

for (int i = 1; i <= m; i++)

else

}}

線段樹 洛谷P1438 無聊的數列

一開始嚇死,給區間加上乙個等差數列?然後就發現我們只要維護題目裡說的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顯然也是乙個...

洛谷 線段樹 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 ...