int main() {
    ll n, m,q,a,b;
    scanf("%lld %lld", &n, &m);
    for(ll i = 1; i <= n; i++)
        for(ll j = 1; j <= m; j++)
            {
                scanf("%lld", &P[i][j]);
                sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+P[i][j];
            }
    Tmax.init(n, m);
    scanf("%lld",&q);
    ll sol=0;
    ll sol2=0;
    ll temp=0;
    while(q--)
    {   sol=0;
        temp=LONG_LONG_MAX;
            scanf("%lld %lld",&a,&b);
                for(ll i = 1; i <= n-a+1; i++)
                    for(ll j = 1; j <= m-b+1; j++)
                    {
                        sol=Tmax.query(i,j,i+a-1,j+b-1).mx;
                        sol2=sum[i+a-1][j+b-1]-sum[i+a-1][j-1]-sum[i-1][j+b-1]+sum[i-1][j-1];
                        temp=min(sol*(a*b)-sol2,temp);
                    }
                    printf("%lld\n",temp);
    }
    return 0;
}
示例#2
0
int main(void) {
    int T;
    cin >> T;
    for (int i = 1; i <= T; i++) {
        cout << "Case #" << i << ": ";
        int N, K, X, C;
        // input
        cin >> N >> K >> C >> X;
        vector<int> A(N), B(N);
        for (int i = 0; i < N; i++)
            cin >> A[i];
        for (int i = 0; i < N; i++)
            cin >> B[i];
        for(int i = 1; i <= N; i++)
            for(int j = 1; j <= N; j++)
                P[i][j] = (int) (((long long) A[i-1] * i + (long long) B[j-1] * j + C) % X);

        // initialize
        Tmax.init(N, N);

        long long sum = 0;
        for (int i = 1; i <= N; i++)
            for (int j = 1; j <= N; j++) {
                int ii = i + K - 1, jj = j + K - 1;
                if (ii <= N && jj <= N)
                    sum += Tmax.query(i, j, ii, jj).mx;
            }
        cout << sum << endl;
    }
    return 0;
}
示例#3
0
/* Drier program */
int main(void) {
	int n, m;
	// input
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			scanf("%d", &P[i][j]);

	// initialize
	Tmax.init(n, m);
	Tmin.init(n, m);

	// query
	int x1, y1, x2, y2;
	scanf("%d %d %d %d", &x1, &y1, &x2, &y2);

	Tmax.query(x1, y1, x2, y2).mx;
	Tmin.query(x1, y1, x2, y2).mx;

	// update
	int x, y, v;
	scanf("%d %d %d", &x, &y, &v);
	Tmax.update(x, y, v);
	Tmin.update(x, y, v);

	return 0;
}
int main(void){
	scanf("%d %d", &n, &m);
	int i1, i2, j1, j2, x, y, q, a1, a2, b1, b2;

	P = new int*[n];
	sum = new int*[n];

	for (int i = 0; i < n; i += 1){
		P[i] = new int[m];
		sum[i] = new int[m];
		for (int j = 0;j < m; j += 1){
			scanf("%d", &P[i][j]);
		}
	}
	// cout << "The matrix is filled" << endl;
	precompute_sum(); // precomputation of sum
	// cout << "Sum is precomputed" << endl;




	Tmax.init(n, m);
	// cout << "Tree is initialized " << endl;





	scanf("%d", &q);
	for (int i = 0; i < q; i += 1){
		scanf("%d %d", &x, &y);
		printf("%d\n", ans(x, y));
	}
}
int ans(int x, int y){
	int mintime = INF;
	for (int i = 0; i < n-x+1; i += 1){
		for (int j = 0; j < m-y+1; j += 1){
			int i1 = i, j1 = j, i2 = i+x-1, j2 = j+y-1;
			int maxelem = Tmax.query(i1,j1,i2,j2);
			int cursum = calculate_sum(i1,j1,i2,j2);
			// cout << "For bounds " << i1 << " " << j1 << " and " << i2 << " " << j2 << " max is " << maxelem << " and sum is " << cursum << endl;
			mintime = min(mintime, maxelem*x*y - cursum);
		}
	}
	return mintime;
}