HDU 1892 See you~(二维树状数组的单点更新,区间求值)
来源:互联网 发布:万方数据库 编辑:程序博客网 时间:2024/06/10 21:50
题目链接:点击打开链接
二维树状数组单点更新,区间求值的入门题目:
一维树状数组的思想很容易应用到二维树状数组中,sum[i][j]表示一块矩阵的和,其中i - lowBit(i) < x <= i,j - lowBit(j) < y <= j。
那么求以(x1,y1) (左下角) 和 (x2,y2)(右上角) 为对角线的矩阵的和为getSum(x2,y2) - getSum(x1 - 1,y2) - getSum(x2,y1 - 1) + getSum(x1 - 1,y1 - 1)。
// HDU 1892 See you~.cpp 运行:1248ms#include "stdafx.h"#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;int sum[1005][1005];int lowBit(int x) {return x & (-x);}void update(int x, int y, int n) {for (int i = x; i < 1005; i += lowBit(i)) {for (int j = y; j < 1005; j += lowBit(j)) {sum[i][j] += n;}}}int getSum(int x, int y) {int re = 0;for (int i = x; i > 0; i -= lowBit(i)) {for (int j = y; j > 0; j -= lowBit(j)) {re += sum[i][j];}}return re;}int getValue(int x, int y) {//单点更新,区间求值的树状数组也可以单点求值return getSum(x, y) - getSum(x - 1, y) - getSum(x, y - 1) + getSum(x - 1,y - 1);}void init() {memset(sum, 0, sizeof(sum));for (int i = 1; i < 1005; i++) {for (int j = 1; j < 1005; j++) {update(i, j, 1);}}}int main(){int k,m;int x1, y1, x2, y2, n1;//题目给的坐标为从0计数,树状数组需要从下标1开始计数,因此操作时需要转换一下int x11, y11, x22, y22, value;scanf("%d", &k);for(int i = 1;i <= k;i++){scanf("%d", &m);printf("Case %d:\n", i);init();for (int j = 0; j < m; j++) {getchar();char ch = getchar();switch (ch) {case 'S':scanf("%d%d%d%d", &x1, &y1, &x2, &y2);x11 = max(x1, x2);x22 = min(x1, x2);y11 = max(y1, y2);y22 = min(y1, y2);printf("%d\n", getSum(x11 + 1, y11 + 1) - getSum(x22, y11 + 1) - getSum(x11 + 1, y22) + getSum(x22, y22));break;case 'A':scanf("%d%d%d", &x1, &y1, &n1);update(x1 + 1, y1 + 1, n1);break;case 'D':scanf("%d%d%d", &x1, &y1, &n1);value = getValue(x1 + 1,y1 + 1);n1 = min(value, n1);update(x1 + 1, y1 + 1, -n1);break;case 'M':scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &n1);value = getValue(x1 + 1, y1 + 1);n1 = min(value, n1);update(x1 + 1, y1 + 1, -n1);update(x2 + 1, y2 + 1, n1);break;}}} return 0;}
阅读全文
1 0
- HDU 1892 See you~(二维树状数组的单点更新,区间求值)
- HDU 1892 See you~(二维树状数组 单点更新)
- HDU 1892 See you~ 二维树状数组更新点查找区间
- HDU 1892 See you~ 二维树状数组
- hdu 1892 see you ~(二维树状数组)
- hdu-1892-See you~ 二维树状数组
- hdu 1892 See you~(二维树状数组)
- 二维树状数组 hdu 1892 See you~
- HDU 1892 See you~ (二维树状数组)
- hdu 1892 See you~(二维树状数组)
- 一维树状数组和二维树状数组和三维树状数组的区间更新单点求值
- hdu - 1892 - See you~(二维树状数组(单点修改))
- hdu 3584 三维树状数组 区间 更新 单点求值
- hdu 4031 Attack(树状数组区间更新单点求值&暴力)
- POJ - 2155 Matrix (二维树状数组 + 区间修改 + 单点求值 或者 二维线段树 + 区间更新 + 单点求值)
- hdu-See you~(二维树状数组)
- 【树状数组+二维】杭电 hdu 1892 See you~
- HDU 1892 See you~(经典二维树状数组)
- hdu 1232 畅通工程(并查集)
- Linux 4种互斥锁
- JDBC数据库mysql
- Random的nextInt用法
- Ubuntu16.0下codeblocks配置opencv2
- HDU 1892 See you~(二维树状数组的单点更新,区间求值)
- Keil5安装破解,兼容支持Keil4工程编译下载等
- [笔记]python网络爬虫:一个简单的爬取图片并存储示例
- MAVEN的继承:坐标的继承
- python20socket编程
- 分页的用法
- hdu2064
- 暑假学学cad
- solr单机版安装