HJ浇花——树状数组+差分

题目链接:

   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 }

 

转载于:https://www.cnblogs.com/blame/p/11280719.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值