POJ 2155 2维线段树 || 2维BIT
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <stack>
#define mp make_pair
#define pa pair<int,int>
#define pb push_back
#define fi first
#define se second
using namespace std;
inline void Get_Int(int &X)
{
X=; char ch=getchar(); int f=;
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {X=X*+ch-''; ch=getchar();} X*=f;
}
inline void Put_Int(int X)
{
char ch[]; int top=;
if (X==) ch[++top]='';
while (X) ch[++top]=X%+'',X/=;
while (top) putchar(ch[top--]); putchar('\n');
}
//=======================================
const int Maxn=;
int x1,x2,y1,y2,Ans;
bool Key[Maxn][Maxn];
int n,Q,Kase;
void Modify_Y(int ox,int oy,int l,int r,int p,int q)
{
if (l==p && r==q)
{
Key[ox][oy]^=;
return;
}
int mid=(l+r)>>;
if (q<=mid) Modify_Y(ox,oy<<,l,mid,p,q);
if (p>=mid+) Modify_Y(ox,oy<<|,mid+,r,p,q);
if (p<=mid && q>=mid+) Modify_Y(ox,oy<<,l,mid,p,mid),Modify_Y(ox,oy<<|,mid+,r,mid+,q); }
void Modify_X(int ox,int l,int r,int p,int q)
{
if (l==p && r==q)
{
Modify_Y(ox,,,n,y1,y2);
return;
}
int mid=(l+r)>>;
if (q<=mid) Modify_X(ox<<,l,mid,p,q);
if (p>=mid+) Modify_X(ox<<|,mid+,r,p,q);
if (p<=mid && q>=mid+) Modify_X(ox<<,l,mid,p,mid),Modify_X(ox<<|,mid+,r,mid+,q);
} void Query_Y(int ox,int oy,int l,int r)
{
Ans^=Key[ox][oy];
if (l==r) return;
int mid=(l+r)>>;
if (y1<=mid) Query_Y(ox,oy<<,l,mid);
if (y1>=mid+) Query_Y(ox,oy<<|,mid+,r);
}
void Query_X(int ox,int l,int r)
{
Query_Y(ox,,,n);
if (l==r) return;
int mid=(l+r)>>;
if (x1<=mid) Query_X(ox<<,l,mid);
if (x1>=mid+) Query_X(ox<<|,mid+,r);
}
int main()
{
Get_Int(Kase);
for (int kase=;kase<=Kase;kase++)
{
Get_Int(n),Get_Int(Q);
memset(Key,false,sizeof(Key));
for (int i=;i<=Q;i++)
{
char ch=getchar(); while (ch!='C' && ch!='Q') ch=getchar();
if (ch=='C')
{
Get_Int(x1),Get_Int(y1),Get_Int(x2),Get_Int(y2);
Modify_X(,,n,x1,x2);
}
if (ch=='Q')
{
Get_Int(x1),Get_Int(y1);
Ans=;
Query_X(,,n);
Put_Int(Ans);
}
}
putchar('\n');
}
return ;
}
线段树
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
const int Maxn=;
int n,Q,Kase,c[Maxn][Maxn],x1,x2,y1,y2;
inline int lowbit(int x) {return x&(-x);}
inline void Modify(int x,int y)
{
for (int i=x;i<=n;i+=lowbit(i))
for (int j=y;j<=n;j+=lowbit(j)) c[i][j]^=;
}
inline int Query(int x,int y)
{
int ret=;
for (int i=x;i;i-=lowbit(i))
for (int j=y;j;j-=lowbit(j)) ret^=c[i][j];
return ret;
}
int main()
{
// freopen("c.in","r",stdin);
scanf("%d",&Kase);
for (int kase=;kase<=Kase;kase++)
{
scanf("%d%d",&n,&Q);
memset(c,,sizeof(c));
for (int i=;i<=Q;i++)
{
char ch=getchar(); while (ch!='C' && ch!='Q') ch=getchar();
if (ch=='C')
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
Modify(x1,y1),Modify(x1,y2+),Modify(x2+,y1),Modify(x2+,y2+);
}
if (ch=='Q')
{
scanf("%d%d",&x1,&y1);
printf("%d\n",Query(x1,y1));
}
}
puts("");
}
return ;
}
BIT
POJ 2155 2维线段树 || 2维BIT的更多相关文章
- CodeForces 242E - XOR on Segment 二维线段树?
今天练习赛的题....又是线段树的变换..拿到题我就敲了个点更新区间查询的..果断超时...然后想到了可以将每个数与合表示成不进位的二进制数..这样就可以区间进行更新了..比赛的时候写搓了..刚重写了 ...
- Wannafly Winter Camp 2020 Day 5I Practice for KD Tree - 二维线段树
给定一个 \(n \times n\) 矩阵,先进行 \(m_1 \leq 5e4\) 次区间加,再进行 \(m_2 \leq 5e5\) 次询问,每次询问要求输出矩形区间内的最大数.\(n \leq ...
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17880 Accepted: 6709 Descripti ...
- POJ 2155 Matrix (二维线段树)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
- poj 2155 matrix 二维线段树 线段树套线段树
题意 一个$n*n$矩阵,初始全为0,每次翻转一个子矩阵,然后单点查找 题解 任意一种能维护二维平面的数据结构都可以 我这里写的是二维线段树,因为四分树的写法复杂度可能会退化,因此考虑用树套树实现二维 ...
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...
- POJ 2155 Matrix【二维线段树】
题目大意:给你一个全是0的N*N矩阵,每次有两种操作:1将矩阵中一个子矩阵置反,2.查询某个点是0还是1 思路:裸的二维线段树 #include<iostream>#include< ...
- POJ 2155 二维线段树 经典的记录所有修改再统一遍历 单点查询
本来是想找一个二维线段树涉及懒惰标记的,一看这个题,区间修改,单点查询,以为是懒惰标记,敲到一半发现这二维线段树就不适合懒惰标记,你更新了某段的某列,但其实其他段的相应列也要打标记,但因为区间不一样, ...
- poj 1195:Mobile phones(二维线段树,矩阵求和)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14391 Accepted: 6685 De ...
随机推荐
- 20160620001 FileUpload控件获取上传文件的路径
参考地址: http://bbs.csdn.net/topics/350051517 —————————————————————————————— 用js实现 <%@ Page Language ...
- hdu 5749 Colmerauer
题意:对于给定的$n \times m$矩阵$M$,定义$S(a,b)$为$M$的所有$a \times b$子矩阵的权重之和.一个矩阵的权重是指矩阵中所有马鞍点权值之和,在一个矩阵中某点是马鞍点当且 ...
- Editplus配置VC++(1) 及相关注意事项
下篇文章:Editplus配置VC++(2) 与/d1reportSingleClassLayout 原本用的是VC++2010 现在换成了Visual Studio 2013,editplus相关配 ...
- easyui 动态列
$.post('${createLink(action:"build Columns url ")}', params, function(data){ var columns = ...
- (原创)LAMP搭建之一:图解如何安装并检查LAMP
LAMP搭建之一:图解如何安装并检查LAMP 第一步:安装Linux(RedHat5) 第二步:rpm -qa httpd(查看apache是否安装) rpm -qa php(查看php是否安装) r ...
- FormData、Blob、File、ArrayBuffer数据类型
XMLHttpRequest 1.0 1.0 中xmlhttpRequest有2个重要的返回属性,reposeText,reposeXml.下面的数据类型都是2.0新增的 FormData对象 我们应 ...
- Linux 监控文件被什么进程修改
安装: apt-get install auditd. auditd 是后台守护进程,负责监控记录 auditctl 配置规则的工具 auditsearch 搜索查看 aureport 根据监控记录生 ...
- 转json using指令
using Newtonsoft.Json;using Newtonsoft.Json.Converters; string result = JsonConvert.SerializeObject( ...
- 数据库 基础篇3(mysql语法)
4 数据库管理(接上篇) 4.1 查询所有数据库 mysql> show databases; +--------------------+ | Database | +-- ...
- SpringMVC -- 梗概--壹
1.springMVC:MVC开源框架 2.springMVC开发流程: 2.1 导包: 2.2 配置前端控制器(核心) DispatcherServlet <servlet> <s ...