https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F

【题意】

给定一个矩阵,每个格子的初始值为1。现在可以对矩阵有四种操作:

A x y n1 :给格点(x,y)的值加n1

D x y n1: 给格点(x,y)的值减n1,如果现在格点的值不够n1,把格点置0

M x1 y1 x2 y2:(x1,y1)移动给(x2,y2)n1个

S x1 y1 x2 y2 查询子矩阵的和

【思路】

当然是二维树状数组

但是一定要注意:lowbit(0)是死循环,一定不能是0。所以初始化格点为1的时候要从1开始,以及对于输入的坐标,我们要加1处理。

【Accepted】

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath> using namespace std;
typedef long long ll;
int n;
const int maxn=1e3+;
int bit[maxn][maxn]; int lowbit(int x)
{
return (-x)&x;
} void add(int x,int y,int val)
{
while(x<maxn)
{
int temp=y;
while(temp<maxn)
{
bit[x][temp]+=val;
temp+=lowbit(temp);
}
x+=lowbit(x);
}
} int sum(int x,int y)
{
int ans=;
while(x>)
{
int temp=y;
while(temp>)
{
ans+=bit[x][temp];
temp-=lowbit(temp);
}
x-=lowbit(x);
}
return ans;
} int solve(int x1,int y1,int x2,int y2)
{
return sum(x2,y2)-sum(x1-,y2)-sum(x2,y1-)+sum(x1-,y1-);
} char op[];
int main()
{
int T;
scanf("%d",&T);
int cas=;
while(T--)
{
printf("Case %d:\n",++cas);
memset(bit,,sizeof(bit));
for(int i=;i<maxn;i++)
{
for(int k=;k<maxn;k++)
{
add(i,k,);
}
}
scanf("%d",&n);
for(int i=;i<n;i++)
{
// getchar();
scanf("%s",op);
if(op[]=='S')
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++;y1++;x2++;y2++;
if(x1>x2)
{
swap(x1,x2);
}
if(y1>y2)
{
swap(y1,y2);
}
printf("%d\n",solve(x1,y1,x2,y2));
}
if(op[]=='A')
{
int x,y,n1;
scanf("%d%d%d",&x,&y,&n1);
x++;y++;
add(x,y,n1);
}
if(op[]=='D')
{
int x,y,n1;
scanf("%d%d%d",&x,&y,&n1);
x++;y++;
if(solve(x,y,x,y)<n1)
{
n1=solve(x,y,x,y);
}
add(x,y,-n1);
}
if(op[]=='M')
{
int x1,y1,x2,y2,n1;
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n1);
x1++;y1++;x2++;y2++;
if(solve(x1,y1,x1,y1)<n1)
{
n1=solve(x1,y1,x1,y1);
}
add(x1,y1,-n1);
add(x2,y2,n1);
}
}
}
return ;
}

二维树状数组

【知识点】

1. 树状数组是O(logn)的,是因为n的二进制里最多有logn个1

2. 注意:树状数组的下标必须从1开始,,因为lowbit(0)=0,如果从0开始的话就会陷入死循环!!树状数组适用于所有满足结合律的运算(加法,乘法,异或等)

3. 所有树状数组能完成的操作线段树都能够完成,但是线段树的代码复杂,时间复杂度也比较高,查询、修改需要递归完成,而,树状数组的操作不仅代码简洁,便于理解,而且一切都是递推完成的,所以能用树状数组解决的问题尽量不要用线段树来写。

4. 树状数组可以查找逆序对,对于LIS问题可以查找方案数。

【二维树状数组】See you~的更多相关文章

  1. 二维树状数组 BZOJ 1452 [JSOI2009]Count

    题目链接 裸二维树状数组 #include <bits/stdc++.h> const int N = 305; struct BIT_2D { int c[105][N][N], n, ...

  2. HDU1559 最大子矩阵 (二维树状数组)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1559 最大子矩阵 Time Limit: 30000/10000 MS (Java/Others)  ...

  3. POJMatrix(二维树状数组)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 22058   Accepted: 8219 Descripti ...

  4. poj 1195:Mobile phones(二维树状数组,矩阵求和)

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14489   Accepted: 6735 De ...

  5. Codeforces Round #198 (Div. 1) D. Iahub and Xors 二维树状数组*

    D. Iahub and Xors   Iahub does not like background stories, so he'll tell you exactly what this prob ...

  6. POJ 2155 Matrix(二维树状数组+区间更新单点求和)

    题意:给你一个n*n的全0矩阵,每次有两个操作: C x1 y1 x2 y2:将(x1,y1)到(x2,y2)的矩阵全部值求反 Q x y:求出(x,y)位置的值 树状数组标准是求单点更新区间求和,但 ...

  7. [poj2155]Matrix(二维树状数组)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 25004   Accepted: 9261 Descripti ...

  8. POJ 2155 Matrix (二维树状数组)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17224   Accepted: 6460 Descripti ...

  9. [POJ2155]Matrix(二维树状数组)

    题目:http://poj.org/problem?id=2155 中文题意: 给你一个初始全部为0的n*n矩阵,有如下操作 1.C x1 y1 x2 y2 把矩形(x1,y1,x2,y2)上的数全部 ...

  10. MooFest_二维树状数组

    Description Every year, Farmer John's N (1 <= N <= 20,000) cows attend "MooFest",a s ...

随机推荐

  1. 自定义View(12)绘制.9图片

    代码如下: // 绘制.9图片 void draw9Path(Canvas canvas){ //创建一个ninePatch的对象实例,第一个参数是bitmap.第二个参数是byte[],这里其实要求 ...

  2. mysqlshow(数据库对象查看工具)

    mysqlshow是mysql客户端对象查看工具,可以用来查看数据库.数据库中的表.表中的列.索引等. 1.mysqlshow命令的语法 shell > mysqlshow [options] ...

  3. 点击后打开QQ临时会话

    1.QQ官方提供的代码.如果没有加好友需要加好友才能聊天,也可以到这里http://shang.qq.com/v3/index.html 开通一个服务,同样可以实现临时会话. <a href=& ...

  4. Webform 内置对象 Response对象、Request对象,QueryString

    Request对象:获取请求Request["key"]来获取传递过来的值 QueryString:地址栏数据传递 ?key=value&key=value注意事项:不需要 ...

  5. php中 mysql 插入特殊字符(手机端的emoji表情)出现异常

    今天在用mysql存储从微信服务器拉来的数据,出现插入数据异常,报 Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F 的错误. 最终在网上查了一下,有 ...

  6. R in action读书笔记(15)第十一章 中级绘图 之二 折线图 相关图 马赛克图

    第十一章 中级绘图 本节用到的函数有: plot legend corrgram mosaic 11.2折线图 如果将散点图上的点从左往右连接起来,那么就会得到一个折线图. 创建散点图和折线图: &g ...

  7. 更改ligerui源码实现分页样式修改

    修改后样式: 第一步:实现功能. 更改源码部分ligerui.all.js文件 读源代码,发现ligerui底部工具条是这样实现的(ps:注释部分为源码) _render: function () { ...

  8. vue HTTP请求(针对vue-resource)

    //初始化页面需要做什么事情 //点击后需要做什么事情 //鼠标.键盘.冒泡.默认行为等事件 //前端调用接口就是按需展示数据//created和mounted里面都可以做数据处理,唯一不同的是cre ...

  9. 迅为I.MX6Q开发板配不同分辨率不同尺寸液晶屏幕

    I.MX6Q开发板: 核心板参数 尺寸:51mm*61mm iMX6Q四核CPU:Freescale Cortex-A9 四核 i.MX6Q,主频 1.2 GHz iMX6DL双核CPU:Freesc ...

  10. linux查看内核版本和发行版本号

    1.查看Linux内核版本号:1.1 uname -r #查看当前linux系统的内核版本号显示举例:2.6.21-1.3194.fc71.2 uname -a #可以查看包括内核版本号.机器硬件信息 ...