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
*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

hdu4777 求区间内与其它数均互质的数的个数(树状数组+离线处理)

hdu4777 树状数组解题神思想 题意:有n(1 解题思路: 离线处理+树状数组,首先预处理出[1,200000]所有数的质因子,放到have[]里面,然后根据输入的n个数w[],求出每个数的...

SPOJ D-query 区间不同数的个数 [在线主席树 or 离线树状数组]

给出N个数,M个询问,每次询问给出区间内不同数的个数。

Hdu4417线段树求区间统计+离线处理 线段树 树状数组

题意:给定一段区间每个点有个高度。在m次询问中每次给出左右端点和可以到达的高度,统计有多少个是小于到达高度 线段树 #include #include using namespace st...

hdu 3874 Necklace 求数组任意区间和(相同元素只算一次) 树状数组+离线算法

Problem DescriptionMery has a beautiful necklace. The necklace is made up of N magic balls. Each bal...

spoj D-query 区间不同数个数 主席树||离线+树状数组

把区间统计转化为前缀和,这里的前缀和不是普通的前缀和,对相同的ai,只有最右边那个才是有效的。 举个栗子:1 2 2 1 3 这样一个序列有效是这个样子 * * 2 1 3 ,因为1在后面出现过所以前...
  • Mtrix
  • Mtrix
  • 2016-08-27 16:45
  • 606

离线记录+树状数组(hdu 5869 统计任意区间的不同gcd值)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,给出范围[l,r],求在这范围内的不同gcd值得个数(连续下标) 题解:...

【Codeforces Round 365 (Div 2)D】【离线询问 树状数组 前驱思想】Mishka and Interesting sum 区间内出现次数偶数的数的异或和

#include #include #include #include #include #include #include #include #include #include #include #...

FZU 2236 第十四个目标(严格上升子序列个数 离散化 + 树状数组)

FZU 2236 第十四个目标(严格上升子序列个数 离散化 + 树状数组)

hdu 4638 树状数组 区间内连续区间的个数(尽可能长)

Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su...

HDU_2227 求不减子序列的个数(树状数组+DP)

题目的意思比较明确,就是求不减子序列的个数。那道题目很容易想到的是dp来写,DP的地推公式就是 dp[i] = sum{dp[j] | j 这个样子复杂度就是o(n^2),肯定过不了,我们最多能...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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