Codeforces Round #427 (Div. 2) C Star sky(二维前缀和)

题目链接:Star sky

题意:给你n个点,每个点有初始亮度,每过一秒钟亮度加一,亮度最多为c,超过变为零,不断循环。有q次询问,每次询问t秒时刻某个矩阵的亮度总和。

solution:暴力会超时,可以预先处理0秒时刻亮度的前缀。

#include <bits/stdc++.h>

int mp[200][200][20];
int cnt;
int main()
{
//    freopen("in.txt","r",stdin);
    int n,q,c;
    int x,y,s;
    scanf("%d%d%d",&n,&q,&c);
    for(int i=0; i<n; ++i)
    {
        scanf("%d%d%d",&x,&y,&s);
        mp[x][y][s]++;
    }
    for(int x=1; x<=100; ++x)
    {
        for(int y=1; y<=100; ++y)
        {
            for(int k=0; k<=c; ++k)
            {
                mp[x][y][k]+=mp[x-1][y][k]+mp[x][y-1][k]-mp[x-1][y-1][k];
            }
        }
    }

//    for(int k=0; k<=1; ++k)
//    {
//        for(int x=1; x<=3; ++x)
//        {
//            for(int y=1; y<=3; ++y)
//            {
//            printf("%d ",mp[x][y][k]);
//
//            }
//            printf("\n");
//        }
//    }
    int t,x1,x2,y1,y2;
    for(int i=0; i<q; ++i)
    {
        int sum=0;
        scanf("%d%d%d%d%d",&t,&x1,&y1,&x2,&y2);
        for(int k=0; k<=c; ++k)
        {
            int q=(k+t)%(c+1);
            sum+=q*(mp[x2][y2][k]-mp[x2][y1-1][k]-mp[x1-1][y2][k]+mp[x1-1][y1-1][k]);
        }
        printf("%d\n",sum);
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/gzhynl/p/8981374.html