POJ1195 Mobile phones【树状数组】【二维】

题目链接:

http://poj.org/problem?id=1195

题目大意:

给出一个N*N的矩阵,初始化都为0,坐标从(0,0)开始。有三个操作:

命令1:1 x y w;将坐标为(x,y)处的点值增加w

命令2:2 x1 y1 x2 y2;询问左下角坐标为(x1,y1)、右上角坐标为(x2,y2)的矩阵和是多少

命令3:3;不需要操作,退出。

思路:

二位树状数组单点更新,区间求值的简单题。直接做就可以了。最后求矩阵和的时候考虑容斥定理。

即ans = Query(x1-1,y1-1)-Query(x1-1,y2)-Query(x2,y1-1)+Query(x2,y2)。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define LL __int64
using namespace std;
const int MAXN = 1100;

int Tree[MAXN][MAXN],N = 1025;

int Lowbit(int x)
{
    return x & (-x);
}

void Update(int x,int y,int w)
{
    for(int i = x; i <= N; i += Lowbit(i))
        for(int j = y; j <= N; j += Lowbit(j))
            Tree[i][j] += w;
}

LL Query(int x,int y)
{
    LL sum = 0;
    for(int i = x; i > 0; i -= Lowbit(i))
        for(int j = y; j > 0; j -= Lowbit(j))
            sum += Tree[i][j];
    return sum;
}

int main()
{
    int op,n;
    while(~scanf("%d%d",&op, &n))
    {
        memset(Tree,0,sizeof(Tree));
        while(~scanf("%d",&op) && op != 3)
        {
            if(op == 1)
            {
                int x,y,w;
                scanf("%d%d%d",&x,&y,&w);
                Update(x+1,y+1,w);
            }
            else if(op == 2)
            {
                int x1,y1,x2,y2;
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                x1++,y1++,x2++,y2++;
                printf("%I64d\n",Query(x1-1,y1-1)-Query(x1-1,y2)-Query(x2,y1-1)+Query(x2,y2));
            }
        }

    }

    return 0;
}
时间: 2024-10-16 14:30:58

POJ1195 Mobile phones【树状数组】【二维】的相关文章

【POJ 1195】 Mobile phones (树状数组)

[POJ 1195] Mobile phones (树状数组) Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 16761   Accepted: 7713 Description Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows. The ar

HDU 1892(树状数组二维)

See you~ Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 4167    Accepted Submission(s): 1311 Problem Description Now I am leaving hust acm. In the past two and half years, I learned so many kn

树状数组 / 二维树状数组

一维树状数组 · 单点修改 + 单点查询: 直接使用即可 · 区间修改 + 单点查询: 另外维护一个维护前缀和的树状数组,查询时查询与原值相加即可. · 区间修改 + 区间查询: <div align=center> 居中 </div> 原文地址:https://www.cnblogs.com/Colythme/p/9853159.html

【树状数组二维区间加+区间查询模板】bzoj3132

新知识,其实和之前讲过的一维差不多,只要维护四个数组就行了,不过还是参考了别人的代码,还是要好好练练才行 #include<iostream> #include<cstdio> #include<cstring> #define maxn 2050 using namespace std; int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn],d[maxn][maxn]; int n,m; int lowbit(int x){ret

【算法#3】树状数组&amp;二叉索引树

其实是数据结构. 智推连续几天给我推树状数组的模板,还放在第一位-- 对着蓝书的图看了好几天才看懂,树状数组的另外一个名字是二叉索引树,指通过把一个数组抽象的变形成树状的以求得到树形数据结构的效果.有人说是线段树的阉割版,我不太清楚,树状数组应该是不支持区间修改加速的. 首先我们需要理解lowbit的概念,它指的是一个数转成二进制后位数最低的那个1表示的值.它具有一个特殊的性质但是为什么具有这个性质是无须证明也不用了解的. 然后我们画一个图,在一定范围内按lowbit的大小从上向下逐层分布,一层

树状数组

树状数组                   转自:      By 岩之痕  http://blog.csdn.net/zearot/article/details/45028723 一.概述 树状数组是一种 用数组进行存储的 自下而上进行操作的  多叉树. 以下叙述中,A为原数组,C为树状数组所用的数组,B为特殊情况需要用到的辅助数组. 最基本的应用就是维护一个支持两种操作的数列:1.让A[i]加上某数X     2.求一个区间A[L] + A[L+1] + ... + A[R] 的和. 树

BIT 树状数组 详解 及 例题

(一)树状数组的概念 如果给定一个数组,要你求里面所有数的和,一般都会想到累加.但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加的方法还有一个局限,那就是,当修改掉数组中的元素后,仍然要你求数组中某段元素的和,就显得麻烦了.所以我们就要用到树状数组,他的时间复杂度为O(lgn),相比之下就快得多.下面就讲一下什么是树状数组: 一般讲到树状数组都会少不了下面这个图: 下面来分析一下上面那个图看能得出什么规律: 据图可知:c1=a1,c2=a1+a2,c3=a3,c4

HDU - 2227 Find the nondecreasing subsequences (树状数组 + 子序列 + 离散化)

HDU - 2227 Find the nondecreasing subsequences Time Limit: 5000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status Description How many nondecreasing subsequences can you find in the sequence S = {s1, s2, s3, ...., sn} ? For exa

POJ1195 Mobile phones 【二维树状数组】

Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14288   Accepted: 6642 Description Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows. The area is divided into squares. The

POJ1195 Mobile phones 二维树状数组的应用

这题可以用线段树离散化做,用二维树状数组做了一下,不懂得可以看一下这篇文章:http://www.java3z.com/cwbwebhome/article/article1/1369.html?id=4804 题意: 给你一个s*s的正方形区域,先输入一个x,若x==0,则再输入一个s,若x==1,则输入x,y,a,表示矩阵中(x,y)这点的值加上a,若x==2,输入l,b,r,t,代表以左上角的点(l,b)右下角的点(r,t),求这一片矩形内的矩阵元素之和,若x==3则结束此次程序 就是最基