题目链接:
https://ac.nowcoder.com/acm/problem/21744
题目思路:
题目关键是模拟浇花的过程,如果我们用普通数组的话每次浇花来更新区间的话显然是线性级别;
用差分可以更快的可以在常数级的时间上更新区间;
代码:
1 #include <bits/stdc++.h> 2 #define maxn 1000005 3 4 using namespace std; 5 6 int ans[maxn]; 7 int c[maxn]; //差分数组 8 int n=1000001; 9 int lowbit(int n) 10 { 11 return n&(-n); 12 } 13 void updata(int i,int k) 14 { 15 while(i<=n) 16 { 17 c[i]+=k; 18 i+=lowbit(i); 19 } 20 } 21 int getsum(int i) 22 { 23 int res=0; 24 while(i>0) 25 { 26 res+=c[i]; 27 i-=lowbit(i); 28 } 29 return res; 30 } 31 int main() 32 { 33 int k; 34 cin>>k; 35 memset(ans,0,sizeof(ans)); 36 memset(c,0,sizeof(c)); 37 int a,b; 38 for(int i=0; i<k; i++) 39 { 40 cin>>a>>b; 41 a++; //差分数组维护的是[1,n]区间,而浇水区间是[0,100000]; 42 b++; 43 updata(a,1); 44 updata(b+1,-1); 45 } 46 for(int i=1; i<=1000001; i++) //将每个位置i被浇水的次数求出来 47 { 48 ans[getsum(i)]++; 49 } 50 for(int i=1; i<=k; i++) 51 { 52 cout<<ans[i]<<" "; 53 } 54 }