NC204863. 牛妹吃豆子
描述
输入描述
输入一行四个数字
表示棋盘的大小.有 次操作和 次询问
下面 行,每行四个数字
表示牛可乐会将所有满足 这两个条件的位置上放一个豆子。
下面 行,每行四个数字
表示询问所有满足 这两个条件的位置上中总共有多少个豆子。
输出描述
每次询问,输出一行一个数字表示答案。
示例1
输入:
2 2 1 1 1 1 2 2 1 1 2 1
输出:
2
C++14(g++5.4) 解法, 执行用时: 860ms, 内存消耗: 72568K, 提交时间: 2020-04-21 10:24:13
#include<bits/stdc++.h> #define js ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) using namespace std; long long a[2001][2001],sum[2001][2001],n,m,k,q,x,y,xx,yy; int main() { js; cin>>n>>m>>k>>q; while(k--) { cin>>x>>y>>xx>>yy; ++a[x][y]; --a[x][yy+1]; --a[xx+1][y]; ++a[xx+1][yy+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]; sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]; } while(q--) { cin>>x>>y>>xx>>yy; cout<<sum[xx][yy]-sum[xx][y-1]-sum[x-1][yy]+sum[x-1][y-1]<<endl; } }
C++11(clang++ 3.9) 解法, 执行用时: 370ms, 内存消耗: 65636K, 提交时间: 2020-04-19 18:52:42
#include<bits/stdc++.h> using namespace std; int n,m,k,q,x,y,xx,yy; long long a[2005][2005],sum[2005][2005]; int main(){ scanf("%d%d%d%d",&n,&m,&k,&q); while(k--){ scanf("%d%d%d%d",&x,&y,&xx,&yy); a[x][y]++; a[x][yy+1]--; a[xx+1][y]--; a[xx+1][yy+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]; sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]; } } while(q--){ scanf("%d%d%d%d",&x,&y,&xx,&yy); printf("%lld\n",sum[xx][yy]-sum[xx][y-1]-sum[x-1][yy]+sum[x-1][y-1]); } }