牛妹喫豆子

題目:牛妹喫豆子

題解:這道題用的二維差分和二維前綴和。

前綴和與差分

#include <bits/stdc++.h>
#include <cstdlib>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int N = 2005+10;
const ll mod = 1e9+7;
const ll inf = 1000000000000000000;

int random(int n){
    return (ll)rand()*rand()%n;
}

ll a[N][N],sum[N][N];

int n,m,k,q;
int main(){

    scanf("%d%d%d%d",&n,&m,&k,&q);
/**********************************************************************/
    while(k--){
        int x1,y1,x2,y2;
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        a[x1][y1]++;
        a[x2+1][y2+1]++;
        a[x1][y2+1]--;
        a[x2+1][y1]--;
    }
    //上下兩個操作讓(x1,y1)~(x2,y2)之間的區域同時加上1
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            a[i][j] = a[i-1][j]+a[i][j-1]-a[i-1][j-1]+a[i][j];
        }
    }
/********************************************************************/
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
        }
    }
    while(q--){
        int x1,y1,x2,y2;
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        ll ans = sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
        printf("%lld\n",ans);
    }

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章