SPOJ - MATSUM Matrix Summation---二维树状数组
题目链接:
https://vjudge.net/problem/SPOJ-MATSUM
题目大意:
二维数组,两种操作
SET 将某点设置成x
SUM 求某个区域之和
解题思路:
这里用二维树状数组
SUM可以直接求出来

这里将某点设置成x,和树状数组不同,树状数组是讲某点加上一个值,但是可以另外建一个数组存储当前所有点的数值,如果要将(x, y)设置成d的话,可以先把该点减去a[x][y]再加上d
合并一下就是:add(x, y, d - a[x][y])
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn = ;
int tree[maxn][maxn];
int a[maxn][maxn];//记录当前每个位置的值
int n;
int lowbit(int x)
{
return x & (-x);
}
//修改tree[x][y] += d;
void add(int x, int y, int d)
{
for(int i = x; i <= n; i += lowbit(i))
{
for(int j = y; j <= n; j += lowbit(j))
{
tree[i][j] += d;
}
}
}
//从(1,1)到(x, y)数字之和
ll sum(int x, int y)
{
ll ans = ;
for(int i = x; i > ; i -= lowbit(i))//等于0会无限循环
{
for(int j = y; j > ; j -= lowbit(j))
{
ans += tree[i][j];
}
}
return ans;
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
memset(tree, , sizeof(tree));
memset(a, ,sizeof(a));
char s[];
int x, y, z, x1, y1, x2, y2;
while(scanf("%s", s))
{
if(s[] == 'E')break;
if(s[] == 'E')//SET
{
scanf("%d%d%d", &x, &y, &z);
x++;
y++;//必须从(1,1)开始
add(x, y, z - a[x][y]);//利用之前该位置的数值,就可以把该点设置成z
a[x][y] = z;
}
else if(s[] == 'U')//SUM
{
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
x1++, y1++, x2++, y2++;
ll ans = ;
ans += sum(x2, y2);
ans += sum(x1 - , y1 - );
ans -= sum(x1 - , y2);
ans -= sum(x2, y1 - );
printf("%lld\n", ans);
}
}
}
return ;
}
SPOJ - MATSUM Matrix Summation---二维树状数组的更多相关文章
- POJ 2155 Matrix (二维树状数组)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17224 Accepted: 6460 Descripti ...
- POJ 2155 Matrix【二维树状数组+YY(区间计数)】
题目链接:http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissio ...
- POJ2155 Matrix(二维树状数组||区间修改单点查询)
Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row an ...
- HLJU 1188 Matrix (二维树状数组)
Matrix Time Limit: 4 Sec Memory Limit: 128 MB Description 给定一个1000*1000的二维矩阵,初始矩阵中每一个数都为1,然后为矩阵有4种操 ...
- POJ 2155 Matrix(二维树状数组+区间更新单点求和)
题意:给你一个n*n的全0矩阵,每次有两个操作: C x1 y1 x2 y2:将(x1,y1)到(x2,y2)的矩阵全部值求反 Q x y:求出(x,y)位置的值 树状数组标准是求单点更新区间求和,但 ...
- [POJ2155]Matrix(二维树状数组)
题目:http://poj.org/problem?id=2155 中文题意: 给你一个初始全部为0的n*n矩阵,有如下操作 1.C x1 y1 x2 y2 把矩形(x1,y1,x2,y2)上的数全部 ...
- POJ 2155 Matrix 【二维树状数组】(二维单点查询经典题)
<题目链接> 题目大意: 给出一个初始值全为0的矩阵,对其进行两个操作. 1.给出一个子矩阵的左上角和右上角坐标,这两个坐标所代表的矩阵内0变成1,1变成0. 2.查询某个坐标的点的值. ...
- POJ 2155 Matrix (二维树状数组)题解
思路: 没想到二维树状数组和一维的比只差了一行,update单点更新,query求和 这里的函数用法和平时不一样,query直接算出来就是某点的值,怎么做到的呢? 我们在更新的时候不止更新一个点,而是 ...
- PKU 2155 Matrix(裸二维树状数组)
题目大意:原题链接 题意很简单,就不赘诉了. 解题思路: 使用二维树状数组,很裸的题. 二维的写起来也很方便,两重循环. Add(int x,int y,int val)表示(x,y)-(n,n)矩形 ...
- POJ_2155 Matrix 【二维树状数组】
一.题面 POJ2155 二.分析 楼教主出的题,是二维树状数组非常好的题,还结合了开关问题(开关变化的次数如果为偶数,状态不变,奇数状态相反). 题意就是给了一个二维的坐标平面,每个点初始值都是0, ...
随机推荐
- es6实现类的多重继承
1.类的多种继承,将多个类的接口“混入”(mix in)另一个类. function mix(...mixins) { class Mix { // 如果不需要拷贝实例属性下面这段代码可以去掉 // ...
- javascript的模块发展
谨以此文记录了解js模块的过程 随着ES6的出现,js模块已经成为正式的标准了.曾经为了解决js模块问题而发展起来的民间秘籍,requireJs(AMD).SeaJs(CMD).Node(Common ...
- JMETER CSS JQUERY EXTRACTOR
我想如果你在这里,你可能已经访问了我们关于变量提取的JMeter系列: XPath Extractor:使用XPath Expressions从XML响应中提取内容, Regexp Extractor ...
- Luogu P3265 [JLOI2015]装备购买
好吧刚开始不知道自己在写什么,,,后来写了线性方程组,又过了一天一上午终于明白了... 当然题意很显然:求代价最小的极大线性无关组. 那就高斯消元(好吧刚开始我不会用它来解这道题qwq) 第一个循环是 ...
- Chinese Zodiac (水题)
The Chinese Zodiac, known as Sheng Xiao, is based on a twelve-year cycle, each year in the cycle rel ...
- 华东交通大学2017年ACM“双基”程序设计竞赛 1008
Problem Description 长度为 n 的序列,把它划分成两段非空的子序列,定义权值为:两段子序列的最大值的差的绝对值.求可能的最大的权值.数据范围:2 <= n <= 10^ ...
- java实现的各种hash加密
public class jiami { public static void main(String args[]){ String signString="Thank you!" ...
- Repair 暴力
Description standard input/outputStatements Alex is repairing his country house. He has a rectangula ...
- 车牌号校验js
var regExp = /(^[\u4E00-\u9FA5]{1}[A-Z0-9]{6}$)|(^[A-Z]{2}[A-Z0-9]{2}[A-Z0-9\u4E00-\u9FA5]{1}[A-Z0-9 ...
- java里如何实现对数组中的元素反转[4, 1, 8, 7, 3, 8, 2]变成 [2, 8, 3, 7, 8, 1, 4]
不多说,直接上干货! 给定一个数组,对其进行反转. {3,1,6,5,8,2} --> {2,8,5,6,1,3}; 其实就是头尾元素的位置置换. package zhouls.bigdata. ...