Star sky CodeForces

用一个三维数组cnt[x][y][k]表示从(1, 1)到(x, y)亮度为k的个数,然后查询的时候就是对于每一个亮度,计算出这个亮度t秒后的亮度和当前这个亮度的个数,答案就是他们的乘积, 然后遍历每种亮度就可以算出答案

#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x & (-x))

typedef unsigned long long int ull;
typedef long long int ll;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = 128;
const int maxm = 1000020;
const int mod = 1e9+7;
using namespace std;

int n, m;
int T, tol;
int cnt[maxn][maxn][maxn/10];

void init() {
    memset(cnt, 0, sizeof cnt);
}

int main() {
    init();
    int q, c;
    scanf("%d%d%d", &n, &q, &c);
    int mx=0, my=0;
    int x, y, s;
    for(int i=1; i<=n; i++) {
        scanf("%d%d%d", &x, &y, &s);
        cnt[x][y][s]++;
        mx = max(mx, x);
        my = max(my, y);
    }
    for(int i=1; i<=100; i++) {
        for(int j=1; j<=100; j++) {
            for(int k=0; k<=c; k++) {
                cnt[i][j][k] = cnt[i][j][k] + cnt[i-1][j][k] + cnt[i][j-1][k] - cnt[i-1][j-1][k];
            }
        }
    }
    int t, x1, y1, x2, y2;
    while(q--) {
        scanf("%d%d%d%d%d", &t, &x1, &y1, &x2, &y2);
        int ans = 0;
        for(int k=0; k<=c; k++) {
            int tmp = (k+t) % (c+1);
            int cx = cnt[x2][y2][k] - cnt[x1-1][y2][k] - cnt[x2][y1-1][k] + cnt[x1-1][y1-1][k];
            ans += tmp * cx;
        }
        printf("%d
", ans);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/Jiaaaaaaaqi/p/9525778.html