牛客训练六:海啸(二维树状数组+vector函数的使用)

题目链接:传送门

思路:

二维树状数组,

vector(first,last)函数中assign函数相当于将first中的函数清空,然后将last中的值赋值给first。

参考文章:传送门

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn = 1e6+10;
vector <vector <int> >vc;
int n,m;
int lowbit(int x)
{
    return x&(-x);
}
void update(int x,int y)
{
    int i,j;
    for(i=x;i<=n;i+=lowbit(i))
        for(j=y;j<=m;j+=lowbit(j))
        vc[i][j]+=1;
}
int query(int x,int y)
{
    int i,j,ans=0;
    for(i=x;i>0;i-=lowbit(i))
        for(j=y;j>0;j-=lowbit(j))
        ans+=vc[i][j];
    return ans;
}
int get_sum(int x,int y,int A,int B)
{
    return query(A,B)+query(x-1,y-1)-query(x-1,B)-query(A,y-1);
}
int main(void)
{
    int i,j,x,y,A,B,q,d;
    while(~scanf("%d%d%d",&n,&m,&d)){
        vc.assign(n+2,vector <int>(m+2,0));
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
            {
                scanf("%d",&x);
                if(x>=d) update(i,j);
            }
        scanf("%d",&q);
        while(q--){
            scanf("%d%d%d%d",&x,&y,&A,&B);
            printf("%d\n",get_sum(x,y,A,B));
        }
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/2018zxy/p/10349155.html
今日推荐