牛客小白月賽5 I 區間

2021-08-21 16:22:52 字數 2860 閱讀 3976

apojacsleam喜歡陣列。

他現在有乙個n個元素的陣列a,而他要對a[l]-a[r]進行m次操作:

操作一:將a[l]-a[r]內的元素都加上p

操作二:將a[l]-a[r]內的元素都減去p

最後詢問a[l]-a[r]內的元素之和?

請認真看題乾及輸入描述。

輸入共m+3行:

第一行兩個數,n,m,意義如「題目描述」

第二行n個數,描述陣列。

第3-m+2行,共m行,每行四個數,q,l,r,p,若q為1則表示執行操作2,否則為執行操作1

第4行,兩個正整數l,r

乙個正整數,為a[l]-a[r]內的元素之和
示例1

複製

10 5

1 2 3 4 5 6 7 8 9 10

1 1 5 5

1 2 3 6

0 2 5 5

0 2 5 8

1 4 9 6

2 7

複製

23
題意:區間修改,區間詢問的模版題

思路:模版題,但是不知道為何初始存的時候那裡出錯了,所以用了乙個操作記錄一下,輸出即可

//

// main.cpp

// 區間

//// created by dhl on 2018/7/22.

//#include using namespace std;

const int maxn = 1e6 + 5;

#define ll long long

int n, m;

ll a[maxn], sum1[maxn], sum2[maxn];

void add(ll p, ll x)

}void range_add(ll l, ll r, ll x)

ll ask(ll p)

ll range_ask(ll l, ll r)

int main(int argc, const char * argv)

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

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

int l, r;

cin >> l >> r;

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

ll ans = 0;

for (int i = l; i <= r; i ++)

cout << ans << endl;

return 0;

}//10 5

//1 2 3 4 5 6 7 8 9 10

//1 1 5 5

//1 2 3 6

//0 2 5 5

//0 2 5 8

//1 4 9 6

//2 7

剛才看到學長寫的,對於樹狀陣列又有了新的認識

用sum來代表差分陣列,對l-r的區間修改就是對sum[l]+=x,sum[r + 1]-=x,sum的前i項和就是a[i]的值(深刻體會)

為什麼值改變sum[l]的值,a[i]也會跟著改變呢,應sum[l]改變,意味著a[i]與a[l-1]的差值多了x,而sum[l +1] - sum[r]的值都不變,就是a[l+1]-a[r]的值的差值不變(因為他們增加了相同的x),而sum[r+1]的值減小,就代表著a[r] 值變大而a[r+1]不變,所以差值就減小了。而計算的時候,sum[i]的前i項和,就相當與a[i]的變化量在與a[i]相加,就得到變化後的a[i]的值

//

// main.cpp

// 區間2

//// created by dhl on 2018/7/23.

//#include using namespace std;

const int maxn = 20;

int a[maxn], sum[maxn];

int main(int argc, const char * argv)

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

int l, r;

cin >> l >> r;

long long ans = 0;

for (int i = l; i <= r; i ++)

ans += a[i];

cout << ans << endl;

return 0;

}

這裡的sum是表示的是a[i]的變化值,如果sum一開始就表示a的差分陣列

//

// main.cpp

// 區間2

//// created by dhl on 2018/7/23.

//#include using namespace std;

const int maxn = 1e6 + 5;

int a[maxn], sum[maxn];

int main(int argc, const char * argv)

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

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

int l, r;

cin >> l >> r;

long long ans = 0;

for (int i = l; i <= r; i ++)

ans += a[i];

cout << ans << endl;

return 0;

}

牛客小白月賽5 I 區間

看到乙份不錯的操作。apojacsleam喜歡陣列。他現在有乙個n個元素的陣列a,而他要對a l a r 進行m次操作 操作一 將a l a r 內的元素都加上p 操作二 將a l a r 內的元素都減去p 最後詢問a l a r 內的元素之和?請認真看題乾及輸入描述。輸入共m 3行 第一行兩個數,...

牛客網小白月賽5 I 區間

apojacsleam喜歡陣列。他現在有乙個n個元素的陣列a,而他要對a l a r 進行m次操作 操作一 將a l a r 內的元素都加上p 操作二 將a l a r 內的元素都減去p 最後詢問a l a r 內的元素之和?請認真看題乾及輸入描述。輸入共m 3行 第一行兩個數,n,m,意義如 題目...

區間 interval 牛客小白月賽5

apojacsleam喜歡陣列。他現在有乙個n個元素的陣列a,而他要對a l a r 進行m次操作 操作一 將a l a r 內的元素都加上p 操作二 將a l a r 內的元素都減去p 最後詢問a l a r 內的元素之和?請認真看題乾及輸入描述。輸入共m 3行 第一行兩個數,n,m,意義如 題目...