日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

WEEK5 周记 作业——差分数组_TT的魔法猫

發(fā)布時(shí)間:2023/12/16 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WEEK5 周记 作业——差分数组_TT的魔法猫 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

WEEK5 周記 作業(yè)——差分?jǐn)?shù)組_TT的魔法貓

一、題意

1.簡(jiǎn)述

現(xiàn)有n個(gè)城市,第iii個(gè)城市有一個(gè)資產(chǎn)值a[i]a[i]a[i],每次操作讓區(qū)間[l,r][l,r][l,r]中的城市資產(chǎn)增加ccc,要求qqq操作結(jié)束后,給出每個(gè)城市的資產(chǎn)值。

2.輸入格式

第一行2個(gè)整數(shù):nnnqqq(1≤n,q≤2×105)(1 \le n,q \le 2 \times 10^5)(1n,q2×105)——城市的數(shù)量和操作的次數(shù)。
第二行包含nnn個(gè)整數(shù):a1,a2,...an(?106≤ai≤106)a_1,a_2,...a_n(-10^6 \le a_i \le 10^6)a1?,a2?,...an?(?106ai?106) ——每個(gè)城市的資產(chǎn)值。
下面跟著qqq行,每行代表一個(gè)操作。每一行有3個(gè)數(shù):lllrrrccc(1≤l≤r≤n,?105≤c≤105)(1 \le l \le r \le n,-10^5\le c \le 10^5)(1lrn,?105c105)

3.輸出格式

輸出nnn個(gè)整數(shù)——nnn個(gè)城市的最終資產(chǎn)值。

4.樣例

Input_1

4 2
-3 6 8 4
4 4 -2
3 3 1

Output_1

-3 6 9 2

Input_2

2 1
5 -2
1 2 4

Output_2

9 2

二、算法

主要思路

首先看看暴力行不行。最多有2×1052 \times 10^52×105次操作,每次操作最多修改2×1052 \times 10^52×105個(gè)值,顯然時(shí)間要超過1s。


考慮差分。差分?jǐn)?shù)組可以在O(1)O(1)O(1)的時(shí)間復(fù)雜度內(nèi)修改原數(shù)組一個(gè)區(qū)域內(nèi)的所有元素的值(增/減相同的ccc)。獲取原數(shù)組一個(gè)元素則需要O(n)O(n)O(n),獲取原數(shù)組所有元素的值也只需要O(n)O(n)O(n)
差分?jǐn)?shù)組的構(gòu)建:B[1]=A[1]B[1] = A[1]B[1]=A[1]B[i]=A[i]?A[i?1]B[i] = A[i]-A[i-1]B[i]=A[i]?A[i?1]所以∑B[i]=A[i]\sum B[i]= A[i]B[i]=A[i]A[L]~A[R]均價(jià)上c等價(jià)于B[L]+=cB[L] += cB[L]+=cB[R+1]?=cB[R+1] -= cB[R+1]?=c

所以按照公式,每次操作我們只需要花費(fèi)O(1)O(1)O(1)的時(shí)間,最終輸出所有資產(chǎn)值的時(shí)間復(fù)雜度為O(n)O(n)O(n)。輸出每一個(gè)資產(chǎn)值只需要利用公式:A[i]=A[i?1]+B[i]A[i]=A[i-1]+B[i]A[i]=A[i?1]+B[i]就能依次輸出。


題外

小心B數(shù)組的數(shù)據(jù)范圍,這里應(yīng)該用long long 類型,因?yàn)閷?duì)一個(gè)B數(shù)組的元素是有可能加q次c的,按照q和c的數(shù)據(jù)范圍能看出這種情況下用int是會(huì)爆精度的。

三、代碼

#include<iostream> #include <cmath> #include<sstream> #include<string> #include<cstdlib> #include<cstring> using namespace std; int a[200010]; long long int b[200010];//又爆了int的精度。。 int main() {int n,q,i,j;scanf("%d%d",&n,&q);for(i=1;i<=n;i++) scanf("%d",&a[i]);b[1]=a[1];for(i=2;i<=n;i++) b[i]=a[i]-a[i-1];for(i=0;i<q;i++){int l,r,c;scanf("%d%d%d",&l,&r,&c);b[l]+=c;b[r+1]-=c;}long long int sum=b[1];printf("%d",sum);if(n>1)printf(" "); for(i=2;i<=n;i++){sum=b[i]+sum;printf("%lld",sum);if(i<=n-1) printf(" ");}return 0; }

總結(jié)

以上是生活随笔為你收集整理的WEEK5 周记 作业——差分数组_TT的魔法猫的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。