码迷,mamicode.com
首页 > 编程语言 > 详细

变化的区间树状数组,单点查询

时间:2015-10-19 12:23:20      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

hdu  1556 Color the ball

要想区间改动的话,那么节点就必须往上更新,查询时往上累加。(区间改动。单点查询)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100000+5;
int C[maxn];
int n;
int lowbit(int x)
{
    return (-x)&x;
}
void update(int x,int y)
{
    for(int i=x; i>0;i-=lowbit(i))
        C[i]+=y;
}
int query(int x)
{
    int s=0;
    for(int k=x; k<=n; k+=lowbit(k))
        s+=C[k];
    return s;
}
int main()                                          
{

    int a,b;
    while(cin>>n)
    {
       for(int i=1; i<=n; i++)
        C[i]=0;
       for(int h=0;h<n;h++)
      {
       scanf("%d%d",&a,&b);
       update(b,1);
       update(a-1,-1);
      }
       for(int j=1;j<=n;j++)
        if(j==n)   printf("%d\n",query(j));
       else
          printf("%d ",query(j));
          //printf("%d%c",query(i),i==n?'\n':' ');  
    }
    return 0;
}

 

csu 1335 高桥和低桥(树状数组+二分)


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1e5+10;
int c[N],m,n,k,a[N];
int x[N],y[N];
int lowbit(int k)
{
    return k&(-k);
}
void add(int k,int he)
{
    while(k>0)
    {
        c[k]+=he;
        k-=lowbit(k);
    }
}

int  Q(int k)
{
    int query=0;
    while(k<=n)
    {
     query+=c[k];
        k+=lowbit(k);
    }
    return query;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.cpp","r",stdin);
    #endif // ONLINE_JUDGE
    int t,from,to,he,kkk=1;
    while(~scanf("%d%d%d",&n,&m,&k))
    {
      memset(c,0,sizeof(c));
      for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
        sort(a,a+n);
        int cur=1;
        int s,t;
       for(int i=1;i<=m;i++)
       {
           scanf("%d %d",&s,&t);
           int from=upper_bound(a,a+n,cur)-a;
           int to=upper_bound(a,a+n,s)-a;
           add(from,-1);
           add(to,+1);
           cur=t;
       }
        int ans =0 ;
        for(int i=1;i<=n;i++)
        {
            int kk =Q(i);
            if(kk>=k)
            ans = ans+1;
        }
        printf("Case %d: %d\n",kkk++,ans);
    }
    return 0;
}


相关题:  hdu  A Simple Problem with Integers
                       



版权声明:本文博主原创文章。博客,未经同意不得转载。

变化的区间树状数组,单点查询

标签:

原文地址:http://www.cnblogs.com/lcchuguo/p/4891183.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!