Codeforces 835C-Star sky

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 835C-Star sky相关的知识,希望对你有一定的参考价值。

题目链接:http://codeforces.com/problemset/problem/835/C

题意:天上有很多星星,每个星星有他自己的坐标和初始亮度,然后每个星星的亮度在一秒内会加一如果大于最大亮度C就会变为0,然后观察星星,给出视野范围(矩形)的左下角和右上角,以及观察的时间,问视野中星星亮度总和是多少。

思路:当时做的时候一看这不是二维树状数组吗?但我没有考虑完,直接求的星星的初始亮度的前缀总和,显然这是错误的。正确的做法是开个三维的数组,一个是存星星的初始亮度(初始亮度最大只有10),另外两个相当于二维树状数组,计算亮度为X的星星的前缀和,然后查询的时候直接计算不同初始亮度在当前的亮度总和就是答案了。当前亮度是(初始+时间)%(C+1)。

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX 105
int sky[105][105][15];
int lowbit(int x)
{
    return x&(-x);
}
void update_tree(int x,int y,int val)
{
    for(int i=x;i<=MAX;i+=lowbit(i))
    for(int j=y;j<=MAX;j+=lowbit(j))
        sky[i][j][val]+=1;
}
int query(int x,int y,int val)
{
    int s=0;
    for (int i=x;i>0;i-=lowbit(i))
        for (int j=y;j>0;j-=lowbit(j))
            s+=sky[i][j][val];
    return s;
}
int sum(int x,int y,int xx,int yy,int val)
{
    x--,y--;
    return query(xx,yy,val)-query(xx,y,val)-query(x,yy,val)+query(x,y,val);
}
int main()
{
    int n,q,c;
    int x,y,s,x1,y1,t;
    scanf("%d%d%d",&n,&q,&c);
    while(n--)
    {
        scanf("%d%d%d",&x,&y,&s);
        update_tree(x,y,s);
    }
    while(q--)
    {
        scanf("%d%d%d%d%d",&t,&x,&y,&x1,&y1);
        int ans=0;
        for(int i=0;i<=10;i++)
            ans+=sum(x,y,x1,y1,i)*((i+t)%(c+1));
        printf("%d\n",ans);
    }
    return 0;
}

 

以上是关于Codeforces 835C-Star sky的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #427 (Div. 2) Problem C Star sky (Codeforces 835C) - 前缀和

codeforces-835C. Star sky(维护二维前缀和,dp)

CF427 C star sky 二维数组前缀和

Codeforces 835 F. Roads in the Kingdom

Codeforces 835E The penguin's game

[加强版] Codeforces 835D Palindromic characteristics (回文自动机DP)