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


    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
    ",query(j));
           else
              printf("%d ",query(j));
              //printf("%d%c",query(i),i==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
    ",kkk++,ans);
        }
        return 0;
    }
    


    相关题:  hdu  A Simple Problem with Integers
                           



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

  • 相关阅读:
    INF文件的语法解说转
    VC的拨号上网程序
    sql修复
    flash media server 2 下载 + 无限制序列号
    [原] ASPNET2.0中如何历遍GRIDVIEW
    [net2.0] ASPNET内置安全认证架构 的灵异问题~~~~
    SnagIt的Visual Studio Team System插件
    [翻译]使用HtmlAgilityPack更好的HTML分析和验证
    哪些自动化测试工具支持AJAX
    VSTT Rosario CTP
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4891183.html
Copyright © 2020-2023  润新知