牛客训练六:海啸(二维树状数组+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; }