變化的區間樹狀陣列,單點查詢

weixin_34067049發表於2015-10-19

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
                       



版權宣告:本文博主原創文章。部落格,未經同意不得轉載。

相關文章