博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2155 Matrix
阅读量:5072 次
发布时间:2019-06-12

本文共 1549 字,大约阅读时间需要 5 分钟。

/*  题意: 给定一个0-1矩阵,在线对在范围[x1,y1]-[x2,y2]之内的元素置反,在线求[x,y]元素值  思路: 表面上看,这题的要求似乎和树状数组的使用方法恰好相反,改变的是一个区间,查询的反而是一个点。  实际上可以通过一个转化巧妙的解决。  首先对于每个数A定义集合up(A)表示{A, A+lowbit(A), A+lowbit(A)+lowbit(A+lowbit(A))...}  定义集合down(A)表示{A, A-lowbit(A), A-lowbit(A)-lowbit(A-lowbit(A)) ... , 0}。  可以发现对于任何A
//二维树状数组 using namespace std; int table[1001][1001],n; //树状数组下标范围从[1,1]到[n,n] int lowbit(int x) {
return x&(-x); } void modify(int x, int y) //求up(x,y) {
int i=x; while(i<=n) {
int j=y; while(j<=n) {
table[i][j]++; j+=lowbit(j); } i+=lowbit(i); } } int sum(int x,int y) //求down(x,y) {
int s=0; int i=x; while(i>0) {
int j=y; while(j>0) {
s+=table[i][j]; j-=lowbit(j); } i-=lowbit(i); } return s; } int main() {
int cases,t; cin>>cases; while(cases--) {
memset(table,0,sizeof(table)); scanf("%d%d",&n,&t); while(t--) {
char tag; cin>>tag; if(tag=='C') {
int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); modify(x1,y1); modify(x1,y2+1); modify(x2+1,y1); modify(x2+1,y2+1); } else {
int x,y; scanf("%d%d",&x,&y); printf("%d\n",sum(x,y)%2); } } printf("\n"); } return 0; }

转载于:https://www.cnblogs.com/mjc467621163/archive/2011/07/20/2112200.html

你可能感兴趣的文章
BZOJ 1047 HAOI2007 理想的正方形 单调队列
查看>>
各种语言推断是否是手机设备
查看>>
这个看起来有点简单!--------实验吧
查看>>
小知识:js如何更改css样式
查看>>
PHP count down
查看>>
JVM参数调优:Eclipse启动实践
查看>>
(旧笔记搬家)struts.xml中单独页面跳转的配置
查看>>
不定期周末福利:数据结构与算法学习书单
查看>>
strlen函数
查看>>
Java中的String,StringBuilder,StringBuffer三者的区别
查看>>
Python爬虫
查看>>
LDA
查看>>
轻量级Mysql Sharding中间件——Shark
查看>>
python的列表与shell的数组
查看>>
移动国家号(MCC)
查看>>
关于TFS2010使用常见问题
查看>>
软件工程团队作业3
查看>>
python标准库——queue模块 的queue类(单向队列)
查看>>
display的值有哪些?
查看>>
火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题...
查看>>