fzu count 求区间之间x的个数 离线+树状数组

原创 2012年03月25日 15:00:22

Problem A Count

Accept: 60    Submit: 327
Time Limit: 1000 mSec    Memory Limit : 65536 KB

 Problem Description

Given an array of positive integers and m queries.Each query contains i, j, x, output the number of occurrences of x into the subarray Ai,Ai+1...,Aj.

 Input

There are several cases. The first line of each case contains tow integers n, q(1<=n,q<=100000), indicating the array length and the number of queries.The second line contains n positive integers ai(1 <= ai <= 100000).Next q lines contain three positive integers i,j,x(1<=i<=j<=n).

 Output

For each query output one line, the number of occurrences of x.

 Sample Input

3 2
1 2 1
1 2 1
1 3 1

 Sample Output

1
2

//


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100000+100;
int n,m;
int a[maxn];
int p[maxn],next[maxn];
void tinit()
{
    memset(p,-1,sizeof(p));
    memset(next,-1,sizeof(next));
}
void addedge(int a,int b)//数字a对应位置b
{
    if(p[a]==-1)
    {
        p[a]=b;
        return ;
    }
    next[b]=p[a];
    p[a]=b;
}


struct Node
{
    int l,r,num,id,ans;
};
Node qy[maxn];
bool cmp(Node h,Node k)
{
    return h.num<k.num;
}
bool cmpp(Node h,Node k)
{
    return h.id<k.id;
}


int c[maxn];
void cinit()
{
    memset(c,0,sizeof(c));
}
int lowbit(int x)
{
    return x&(-x);
}
void update(int u,int x)
{
    for(int i=u;i<=n;i+=lowbit(i))
    {
        c[i]+=x;
    }
}
int getsum(int u)
{
    int cnt=0;
    for(int i=u;i>=1;i-=lowbit(i))
    {
        cnt+=c[i];
    }
    return cnt;
}
int tans[maxn];
int main()
{
    while(scanf("%d%d",&n,&m)==2)
    {
        tinit();
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            addedge(a[i],i);
        }
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&qy[i].l,&qy[i].r,&qy[i].num);
            qy[i].id=i;
        }
        sort(qy,qy+m,cmp);
        int pre=-1;
        cinit();
        for(int i=0;i<m;i++)
        {
            if(qy[i].num!=pre)
            {
                pre=qy[i].num;
                int nxt=p[pre];
                while(nxt!=-1)
                {
                    update(nxt,1);
                    nxt=next[nxt];
                }
            }
            int ans=getsum(qy[i].r)-getsum(qy[i].l-1);
            qy[i].ans=ans;
            if(i<m-1&&qy[i].num!=qy[i+1].num)
            {
                int nxt=p[pre];
                while(nxt!=-1)
                {
                    update(nxt,-1);
                    nxt=next[nxt];
                }
            }
        }
        //sort(qy,qy+m,cmpp);
        for(int i=0;i<m;i++) tans[qy[i].id]=qy[i].ans;
        for(int i=0;i<m;i++) printf("%d\n",tans[i]);
    }
    return 0;
}
/*
5 5
1 2 1 2 1
1 2 1
1 3 1
1 4 1
1 5 1
2 3 2
*/

树状数组求区间最大值

讲这个的博文已经不少了,但感觉不够详细不够通俗易懂,所以我尝试着更详细更通俗易懂的说一下我的理解。   这个算法只支持单点修改和区间查询最值。每一次维护和查询的时间复杂度都是O((logn)^2),但...
  • u010598215
  • u010598215
  • 2015年09月04日 10:42
  • 4840

树状数组求区间极值

众所周知树状数组有着良好的特性:代码短,效率高。 但这样优良的数据结构不应只用于我们最初知道的,最基本的应用:单点修改,查询前缀和。 其应用可以更为广泛,如单点修改,查询区间极值。 由于区间极值无法像...
  • u012602144
  • u012602144
  • 2016年10月04日 16:58
  • 285

[树状数组] 区间求和的三种模型

树状数组在区间求和问题上有很高的效率,尤其在非常困难的比赛中(数据量大,对时间限制很严格的比赛)能发挥非常大的作用,其各种复杂度都要比线段树低很多,而且其代码简洁优美……有关区间求和,主要有以下三个模...
  • u012848631
  • u012848631
  • 2015年07月22日 22:06
  • 1630

考试题 树状数组查找以比x大的数作为中位数的个数+二分中位数

Problem II 定义一个长度为奇数的区间的值为其所包含的的元素的中位数 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少 第一行两个数n和k(1 第二行n个数,...
  • pbihao
  • pbihao
  • 2016年08月27日 07:24
  • 210

求第K小/大的数(树状数组解法)

求第K小/大数这个题目经常出现,面试,考试以及OJ上都有类似的题目。 首先声明一点,个人觉得既然是第K小(大是一样的),那么重复的元素就不应该算了,当然如果算了就相对简单一些。。 最原始的解法,快...
  • xueerfei008
  • xueerfei008
  • 2013年09月25日 23:05
  • 4543

树状数组求区间和

#define lowbit(i) ( -i & i) // 二进制数字最低位'1'和其后'0'组成的数字 template class BinaryIndexedTree { public: ...
  • shiyang6017
  • shiyang6017
  • 2016年08月22日 22:42
  • 147

树状数组求区间最大值

这个算法只支持单点修改和区间查询最值。每一次维护和查询的时间复杂度都是O((logn)^2),但这是满打满算的时间复杂度。 假设是要维护和查询区间的最大值(最小值将max改成min 就好了) 这个算法...
  • mosquito_zm
  • mosquito_zm
  • 2017年07月31日 11:02
  • 284

树状数组 --区间查询+区间修改

数据结构
  • FSAHFGSADHSAKNDAS
  • FSAHFGSADHSAKNDAS
  • 2016年09月24日 13:45
  • 3823

动态区间第k小(主席树+线段树套树状数组)

静态区间第k小问题,是给你一个序列,每次询问序列中的一个区间中的第k小数,这个问题用普通的主席树就可以解决。动态区间第k小问题就是在静态的基础上加上了修改操作,也就是每次除了询问区间第k小之外,还可以...
  • creatorx
  • creatorx
  • 2017年07月21日 08:44
  • 324

树状数组的区间修改,单点查询

树状数组的区间修改
  • u013514722
  • u013514722
  • 2014年10月17日 21:49
  • 2649
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:fzu count 求区间之间x的个数 离线+树状数组
举报原因:
原因补充:

(最多只允许输入30个字)