列表

详情


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]);
	}
} 

上一题