1. 程式人生 > >牛客訓練六:海嘯(二維樹狀數組+vector函數的使用)

牛客訓練六:海嘯(二維樹狀數組+vector函數的使用)

ace ssi col csdn ide amp oid std sin

題目鏈接:傳送門

思路:

二維樹狀數組,

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

牛客訓練六:海嘯(二維樹狀數組+vector函數的使用)