HDU1556 Color the ball & 牛客 contest 135-I 區間 [差分標記]
阿新 • • 發佈:2019-01-11
一、差分標記介紹
差分標記用來解決針對區間(修改-查詢)的問題,複雜度比線段樹要更低。推薦這個部落格。
例如,給陣列中處於某個區間的數進行加減操作,然後查詢某個位置上數的變化值。
二、HDU1556 Color the ball
2.1題意
N個氣球依次編號為1,2,3....N.每次給定2個整數a b(a <= b),從氣球a開始到氣球b依次給每個氣球塗一次顏色。求查詢每個氣球被塗的次數。
2.2分析
這裡所有初始值為0,最後答案就是經過差分標記得到的變化值。
2.3程式碼
1 # include <iostream> 2 # include <cstdio> 3# include <cstring> 4 using namespace std; 5 const int maxn = 1e5+10; 6 int sum[maxn]; 7 int N; 8 void Init() 9 { 10 memset(sum,0,sizeof(sum)); 11 } 12 void Solve() 13 { 14 int l,r; 15 for(int i=0;i<N;i++) 16 { 17 scanf("%d%d",&l,&r); 18 sum[l]++;19 sum[r+1]--; 20 } 21 int res = 0; 22 for(int i=1;i<N;i++) 23 { 24 res += sum[i]; 25 printf("%d ",res); 26 } 27 res += sum[N]; 28 printf("%d\n",res); 29 } 30 int main() 31 { 32 while(scanf("%d",&N)!=EOF) 33 { 34 if(N==0) break; 35 Init(); 36 Solve(); 37 } 38 return 0; 39 }
三、牛客contest 135-I 區間(題面)
3.1題意
有一個n個元素的陣列a,對a[L]-a[R]進行M次操作:將a[L]-a[R]內的元素都加上P,詢問a[l]-a[r]內的元素之和
3.2分析
經過M次操作的元素值等於初始值加上變化值,所以用差分標記得到變化值最後輸出時再與原始值相加即可。注意會爆int以及不要開多個大陣列。
3.3程式碼
1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 using namespace std; 5 const int maxn = 1e6+10; 6 int n,M; 7 int a[maxn],sum[maxn]; 8 void Init() 9 { 10 for(int i=1;i<=n;i++) 11 scanf("%d",&a[i]); 12 memset(sum,0,sizeof(sum)); 13 } 14 void Solve() 15 { 16 int q,L,R,P,l,r; 17 for(int i=0;i<M;i++) 18 { 19 scanf("%d%d%d%d",&q,&L,&R,&P); 20 if(q==1) 21 { 22 sum[L] -= P; 23 sum[R+1] += P; 24 } 25 else 26 { 27 sum[L] += P; 28 sum[R+1] -= P; 29 } 30 } 31 scanf("%d%d",&l,&r); 32 long long ans = 0; 33 long long res = 0; 34 for(int i=1;i<=r;i++) 35 { 36 res += sum[i]; 37 if(i>=l) ans += res + a[i]; 38 } 39 printf("%lld\n",ans); 40 } 41 int main() 42 { 43 while(scanf("%d%d",&n,&M)!=EOF) 44 { 45 Init(); 46 Solve(); 47 } 48 return 0; 49 }