1. 程式人生 > >HDU1556 Color the ball & 牛客 contest 135-I 區間 [差分標記]

HDU1556 Color the ball & 牛客 contest 135-I 區間 [差分標記]

一、差分標記介紹

差分標記用來解決針對區間(修改-查詢)的問題,複雜度比線段樹要更低。推薦這個部落格

例如,給陣列中處於某個區間的數進行加減操作,然後查詢某個位置上數的變化值。

二、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 }