zoukankan      html  css  js  c++  java
  • hdu 4417 Super Mario 夜

    http://acm.hdu.edu.cn/showproblem.php?pid=4417

    线段树 or 树状数组 都可以

    先把问题 和 和 砖块 分别按高度排序

    在求解区间答案时 根据要求的高度 将小于这个高度的砖块全部插入 再求解即可

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <queue>
    #include <vector>
    #include <algorithm>
    
    #define LL long long
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    using namespace std;
    const int N=100005;
    int c[N];
    struct q
    {
        int l,r,h,I;
        int ans;
    }qt[N];
    struct inh
    {
        int h,I;
    }in[N];
    int n;
    int lowbit(int x)
    {
        return x&(-x);
    }
    void Add(int x)
    {
        while(x<=n)
        {
            ++c[x];
            x+=lowbit(x);
        }
    }
    int Sum(int x)
    {
        int temp=0;
        while(x>=1)
        {
            temp+=c[x];
            x-=lowbit(x);
        }
        return temp;
    }
    bool cmpqt(q x,q y)
    {
        return x.h<y.h;
    }
    bool cmpin(inh x,inh y)
    {
        return x.h<y.h;
    }
    bool cmpI(q x,q y)
    {
        return x.I<y.I;
    }
    int main()
    {
        //freopen("data.txt","r",stdin);
        int T;
        scanf("%d",&T);
        for(int ca=1;ca<=T;++ca)
        {
            int m;
            scanf("%d %d",&n,&m);
            for(int i=1;i<=n;++i)
            {
                scanf("%d",&in[i].h);
                in[i].I=i;
            }
            for(int i=0;i<m;++i)
            {
                scanf("%d %d %d",&qt[i].l,&qt[i].r,&qt[i].h);
                ++qt[i].l;++qt[i].r;
                qt[i].I=i;
            }
            sort(qt,qt+m,cmpqt);
            sort(in+1,in+n+1,cmpin);
            memset(c,0,sizeof(c));
            int l=1;
            for(int i=0;i<m;++i)
            {
                while(in[l].h<=qt[i].h&&l<=n)
                {
                    Add(in[l].I);
                    ++l;
                }
                qt[i].ans=Sum(qt[i].r)-Sum(qt[i].l-1);
            }
            sort(qt,qt+m,cmpI);
            printf("Case %d:\n",ca);
            for(int i=0;i<m;++i)
            printf("%d\n",qt[i].ans);
    
        }
        return 0;
    }
    
    
  • 相关阅读:
    [JSOI2008]巨额奖金(最小生成树计数)
    [HAOI2008] 糖果传递
    [SCOI2009]生日快乐
    BZOJ2821 作诗
    [HAOI2008]圆上的整点
    POJ1741
    AC自动机
    [JSOI2008]星球大战starwar
    二分图有关证明(感性版)
    初识Pentaho(一)
  • 原文地址:https://www.cnblogs.com/liulangye/p/2703489.html
Copyright © 2011-2022 走看看