POJ 2155 Matrix【 二维树状数组 】
2024-08-31 13:24:30
题意:给出两种操作,C是给出一个矩形的左上角和左下角的下标,把这个矩形里面的0变成1,1变成0,Q是询问某个点的值
看这篇论文讲得很清楚
http://wenku.baidu.com/view/1e51750abb68a98271fefaa8
自己看的时候,把每个点对应覆盖哪些区域画出来,再结合论文里面的,好理解一些
#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; typedef long long LL;
const int INF = (<<)-;
const int mod=;
const int maxn=; int n;
int c[maxn][maxn]; int lowbit(int x){ return x & (-x);} int sum(int x,int y){
int ret=,y1;
while(x>){
y1=y;
while(y1>){
ret+=c[x][y1];y1-=lowbit(y1);
}
x-=lowbit(x);
}
return ret;
} void add(int x,int y,int d){
int y1;
while(x<=n){
y1=y;
while(y1<=n){
c[x][y1]+=d;y1+=lowbit(y1);
}
x+=lowbit(x);
}
} int main(){
int T;
scanf("%d",&T);
while(T--){
int m;
memset(c,,sizeof(c));
scanf("%d%d%*c",&n,&m);
while(m--){
char ch;
scanf("%c",&ch);
if(ch == 'C'){
int x1,y1,x2,y2;
scanf("%d%d",&x1,&y1);
scanf("%d%d%*c",&x2,&y2);
add(x1,y1,);
add(x1,y2+,-);
add(x2+,y1,-);
add(x2+,y2+,);
}
else {
int l,r;
scanf("%d%d%*c",&l,&r);
int ans;
ans=sum(l,r);
printf("%d\n",ans%);
}
}
if(T>=) puts("");
}
return ;
}
最新文章
- W3School-CSS 表格实例
- 移动端框架篇-控制父容器的滑屏框架-slip.js
- python raw String 获取字符串变量中的反斜杠
- SQL 面试题及答案(一)
- 怎么找到MyEclipse->;add struts capabilities
- NSDate和NSString的转换及判定是昨天,今天,明天
- calling c++ from golang with swig--windows dll(一)
- 《RabbitMQ Tutorial》译文 第 3 章 发布和订阅
- 一.初识java
- 【English】20190428
- Requests模块—请求
- Maven中classifier
- kafka channle的应用案例
- 机器学习实战-ch2-有标签的聚类算法
- syslog - 日志文件详解
- Asp.netMVC中Html.Partial,RenderPartial,Action,RenderAction区别和用法
- java好用的邮件发送
- sidecar学习
- 爬虫实战:汽车之家配置页面 破解伪元素和混淆JS
- 如何编写 Python 程序