hdoj 4417 Super Mario

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

你妹妹的 cin cout scanf printf.是差了好远呀,cin cout 会wa但scanf printf就ac了。。

了解了eaual_range()的神奇操作。。

做法就是线段树,vector很强大。。

View Code
#include<iostream>

#include<cstdio>

#include<algorithm>

#include<vector>

#define lson l,m,root<<1

#define rson m+1,r,root<<1|1

using namespace std;

const int maxn=100001;

typedef vector < int >vi;

typedef pair < vi::iterator,vi::iterator> pii;

int h[maxn];

vi tree[maxn*4];

int n,m;

void build(int l,int r,int root)

{

    tree[root].clear();

    for(int i=l;i<=r;i++)

        tree[root].push_back(h[i]);

    sort(tree[root].begin(),tree[root].end());

    if(l==r)return ;

    int m=(l+r)>>1;

    build(lson);

    build(rson);

}

int query(int ll,int rr,int h,int l,int r,int root)

{



    if(ll<=l&&r<=rr)

    {

        pii result;

        result=equal_range(tree[root].begin(),tree[root].end(),h);

        return result.second-tree[root].begin();

    }

    int ans=0;

    int m=(l+r)>>1;

    if(ll<=m)

    ans=query(ll,rr,h,lson);

    if(rr>m)

    ans+=query(ll,rr,h,rson);

    return ans;

}

void solve()

{

       int l,r,h;

       for(int j=1;j<=m;j++)

      {

        scanf("%d%d%d",&l,&r,&h);

        printf("%d\n",query(l,r,h,0,n-1,1));

      }

}

int main()

{

    int test;

    scanf("%d",&test);

    for(int i=1;i<=test;i++)

    {

        scanf("%d%d",&n,&m);

        for(int j=0;j<n;j++)

        scanf("%d",&h[j]);

        printf("Case %d:\n",i);

        build(0,n-1,1);

        solve();



    }

    return 0;

}

你可能感兴趣的:(super)