数格子


有一个S*S的方格,行和列都是从0到S-1。

有四种操作:


操作


参数


含义


0


S


初始化表格,大小为S*S,所有单元格的值均为0。(此操作只出现一次且一定是第一条操作)


1


X Y A


将(X,Y )单元格的值增加A


2


L B R T


询问矩形区域(x,y)内的值的输出答案,其中x,y满足 L<= x <= R, B <=  y <= T


3



结束,此操作只出现一次且一定是最后一条

范围限制:


方格大小


S*S


1  <= S <= 1024


任意时刻单元格的值V


V


0  <= V <= 32767


每次增加的值A


A


-23768  <= A <= 23767


输入的操作总数


M


3  <= M <= 60002


所有单元格值之和


T


T  <= 230

Input

本题只有一组测试数据。

第一行为操作0。

最后一行为操作3。

中间操作数不多于60000。

Output

输入输出格式请参考Description和Sample。

Sample Output

0 4

1 1 2 3

2 0 0 2 2

1 1 1 2

1 1 2 -1

2 1 1 2 3

3

Hint

3

4

裸的二维树状数组。

所求区域和  sum = sum(R, T) – sum(R,B-1) – sum(L-1,T) + sum(L-1,B-1)

注意S及 坐标 应从1开始,所以应对输入坐标做 +1处理。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
#define S 1030
int c[S][S];
int n;
int lowbit(int x)
{
    return x&(-x);
}
void Updata(int x,int y,int val)
{
    for(int i=x; i<=n; i+=lowbit(i))
    {
        for(int j=y; j<=n; j+=lowbit(j))
        {
            c[i][j]+=val;
        }
    }
}
int Getsum(int x,int y)
{
    int sum=0;
    for(int i=x; i>0; i-=lowbit(i))
    {
        for(int j=y; j>0; j-=lowbit(j))
        {
            sum+=c[i][j];
        }
    }
    return sum;
}
int main()
{
    int tt, cmd, x, y, val;
    int x1, y1, x2, y2;
    freopen("B.in","r",stdin);
    freopen("X.out","w",stdout);
    scanf("%d%d",&tt,&n);
    memset(c,0,sizeof(c));
    while(scanf("%d",&cmd) && cmd<3)
    {
        if(cmd==1)
        {
            scanf("%d%d%d",&x,&y,&val);
            x++;
            y++;
            Updata(x,y,val);
        }
        else if(cmd==2)
        {
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            x1++, y1++, x2++, y2++;
            int ans=Getsum(x2,y2)-Getsum(x2,y1-1)-Getsum(x1-1,y2)+Getsum(x1-1,y1-1);
            printf("%d\n",ans);
        }
    }
    return 0;
}

数格子

时间: 2024-10-11 06:20:22

数格子的相关文章

青岛理工ACM交流赛 J题 数格子算面积

数格子算面积 Time Limit: 1000MS Memory limit: 262144K 题目描述 给你一个多边形(用’\’和’/’表示多边形的边),求多边形的面积. 输入 第一行两个正整数h 和 w (2 ≤ h, w ≤ 100),h是多边形所在平面的高,w是多边形所在平面的宽,接下来h行,每行w个字符,描述了整个平面的每个单元(每个单元是一个单位面积),字符只会是’\’,’/’和’.’其中之一,’\’,’/’表示多边形的边,’.’表示空白单元. 输出 输出一个数,输入代表的平面内多边

【NOIP2016提高A组模拟9.17】数格子

题目 分析 设表示每一行的状态,用一个4位的二进制来表示,当前这一行中的每一个位数对下一位有没有影响. 设\(f_{i,s}\)表示,做完了的i行,其状态为s,的方案数. 两个状态之间是否可以转移就留给读者自己思考了. 答案就是\(f_{n,0}\)因为最后一行对下一行不能造成影响. 然而,这样只有60分. 100分是个矩阵快速幂, B矩阵构造很简单,当两个状态\(s.s'\)可以转移,那么,B矩阵\(g_{s,s'}=1\). 当i等于零时, A矩阵为{1, 0 \(<\)repeats 15

时间轮

老早之前就听说时间轮算法特别高效,Linux内核都用的它,这两天抽空实现了遍--嗯,被差一bug搞死(~ ̄▽ ̄~) 啊哈 网上扣来的图,原理好懂:轮子里的每格代表一小段时间(精度),连起来就能表示时间点了(我去年买了个表),格子内含链表,中存回调函数:时间指针每次转动一格,指向某格时,取出链表里的回调函数依次执行,后清空链表,等待下一次转动. 加入节点逻辑也简单:在轮子可表示的时间范围内(格子数*格子精度),配合当前时针位置,对格子总数取余,即得本节点需放哪个格子. 进一步为扩大时间轮的表示范围

Python challenge通关代码及攻略(9-16)

第九题 题目分析 图片上和上一题一样.有奇怪的黑点点.此题应该考察的与上题相同也是图像解析类的. 查看源码. 页面上可以下载good.jpg.然后提示first+second=? 然后first和second各对应一系列的数字.那么应该是两个数字加起来,代表一个像素点. 如果我们在原图片上涂黑点,那么看不出什么变化.于是我们新建一个白底图片,再这个上面涂黑点. 考察知识点 Python-Image 基本的图像处理操作(赞) http://www.aichengxu.com/view/39904

【转】A* A星 算法 C语言 实现代码

http://blog.csdn.net/shanshanpt/article/details/8977512 关于A*算法,很早就想写点什么,可是貌似天天在忙活着什么,可事实又没有做什么,真是浮躁啊!所以今晚还是来写一下总结吧! A*算法是很经典的只能启发式搜索算法,关于只能搜索算法和一般的搜索算法(例如DFS,BFS之类),在语言描述上的区别,我觉得用<代码大全>中的一句话描述的非常好:“驾驶汽车达到某人家,写成算法是:沿167号高速往南行至Puyallup,从XX出口后往山上开4.5英里

[题解+总结]20150929

1.前言 不能这么坑啊!这题目一久远了数据就开始各种坑,谁都不知道有坑但是就我掉进了坑.我还能说什么. 2.Beatle 甲壳先生最新版 大概题意:两个问题:给出一张n*m网格图,求从左下角到右上角直走要经过多少个网格:给出k,求有多少个组(x,y),满足在x*y网格图中直走要经过k个网格. 总结:这道题都错了.怪我看走了眼啊.在小数据找规律的时候我数格子数错了,导致后面的规律就这样随之而来了,结果是个错的,事实上还需要求最大公约数. 题解:找规律+最大公约数. 3.Galaxy 银河系解体 大

百科知识 象棋棋谱怎么解释

象棋棋谱怎么解释? 车七进一 将4进1 马八退七 将4进1 车八退二 将4退1 车七平八 将4退1 马七进八 将4进1 车八平六 士5进4 炮四平五 士4退5 马八退六 将4进1 炮六退四 你好,可以给我解释下吗? ? | 9499个满意答案 2009-06-30 向TA提问 红方棋盘从右向左纵向九条竖线 记为1到9路 黑方从右到左竖线记为1到9路红方的一路 就是黑方的9路 一.走直线的棋子 进退是数格子的 比如红方一路的车向前走一步 就是车一进一 平是记录从几路到几路 红方二路的炮平到五路 就

面试题:P1-数海岸线算法

这是一个比较偏僻的网站上的题目,做这个题目的原因是某同学去面试的时候遇到了这样的题目,然后问我如何做,遇上这样的问题不解决就不是我的风格了. 先给出这个网站的题目网址:http://jobs.p1.com/tech/costal.html 估计很少人上个这个网站,做个这个网站的题目更加少了,所以有公司拿这样的现成的题目考面试者,有面试者做过了的概率是很少的.不过只要学校不太糟糕,那么能做出这样题目的人,进个什么BAT不是什么难事吧. 同时贴出题目吧: Coast Length Puzzle ID

洛谷P3585 [POI2015]PIE

传送门 题目大意:有个n*m的格子图,要求'x'点要被染成黑色 有个a*b的印章,'x'是可以染色的印章上的点. 要求用印章去染色格子 (1)印章不可以旋转. (2)不能把墨水印到纸外面. (3)纸上的同一个格子不可以印多次. 题解:模拟 从题目中可以看出,一定要让印章的左上角对应目前n*m方 格中未染色的左上角.因为要求不能重复染色,可以每染完 一个格子就把它赋值为0.(待染色为1). 开始纯模拟,没有任何优化的代码. 加了个读入优化还是T了两个点,3000ms+ #include<iostr