POJ2155二维线段树
题意:
给一个n*n的01矩阵,然后有两种操作(m次)C x1 y1 x2 y2是把这个小矩形内所有数字异或一遍,Q x y 是询问当前这个点的值是多少?n<=1000 m<=50000.
思路:
做的有点蛋疼,昨天自己用了将近5个小时自己研究了两个二维线段树的算法,都失败了,其实我想到的第二个算法和网上那个差不多(后来看网上的思路才发现),但是我考虑的是段更新的PushDown的问题,其实这个题目是段更新,*点询问*,根据这个可以简化问题,思路很容易想到可以是线段树的线段树,就是线段树跑X确定区间后再线段树去更新y,但是有几点需要注意
1. 可以不用Pushup,Pushdown(因为是点询问,一开始我就考虑段询问,各种自己设想,研究而且还写了个上下左右更新,就是把线段映射成平面,最后悲剧了..你懂的)
2.*当更新大矩形的时候那么他里面的小矩形也相当于更新了,就是假如现在更新
(1,1)(5,5)(1,5),(5,1)这个矩形的时候我们是找到位置直接就return了,其实(1,1)(2,2),(1,2),(2,1)也更新了,但是我们没有继续往下走,所以当我们寻找答案的时候要一路加过来,这个是重点,这么说可能不懂,但是可以看几遍代码,我当时看了下代码马上就懂了,可能是我昨天想的要比正解难很多,想到头疼,而且思路相近,所以一看就懂了,但是不管是谁,只要考虑过,应该很容易懂,很可惜下面的代码的思路并不是我自己想出来的。
#include<stdio.h>
#include<string.h>
#define xlson xl ,xmid ,xt << 1
#define xrson xmid+1 ,xr ,xt << 1 | 1
#define ylson yl ,ymid ,yt << 1
#define yrson ymid+1 ,yr ,yt << 1 | 1
#define N 1005
int cnt[N<<2][N<<2] ,n ,ans;
void UpdateY(int yl ,int yr ,int yt ,int c ,int d ,int xt)
{
if(c <= yl && d >= yr)
{
cnt[xt][yt] ++;
return ;
}
int ymid = (yl + yr) >> 1;
if(c <= ymid) UpdateY(ylson ,c ,d ,xt);
if(d > ymid) UpdateY(yrson ,c ,d ,xt);
return ;
}
void UpdateX(int xl ,int xr ,int xt ,int a ,int b ,int c ,int d)
{
if(a <= xl && b >= xr)
{
UpdateY(1 ,n ,1 ,c ,d ,xt);
return ;
}
int xmid = (xl + xr) >> 1;
if(a <= xmid) UpdateX(xlson ,a ,b ,c ,d);
if(b > xmid) UpdateX(xrson ,a ,b ,c ,d);
return ;
}
void QueryY(int yl ,int yr ,int yt ,int b ,int xt)
{
ans += cnt[xt][yt];
if(yl == yr) return ;
int ymid = (yl + yr) >> 1;
if(b <= ymid) QueryY(ylson ,b ,xt);
else QueryY(yrson ,b ,xt);
return ;
}
void QueryX(int xl ,int xr ,int xt ,int a ,int b)
{
QueryY(1 ,n ,1 ,b ,xt);
if(xl == xr) return ;
int xmid = (xl + xr) >> 1;
if(a <= xmid) QueryX(xlson ,a ,b);
else QueryX(xrson ,a ,b);
return ;
}
int main ()
{
int t ,m ,i ,x1 ,y1 ,x2 ,y2;
char str[5];
scanf("%d" ,&t);
while(t--)
{
scanf("%d %d" ,&n ,&m);
memset(cnt ,0 ,sizeof(cnt));
while(m--)
{
scanf("%s" ,str);
if(str[0] == 'C')
{
scanf("%d %d %d %d" ,&x1 ,&y1 ,&x2 ,&y2);
UpdateX(1 ,n ,1 ,x1 ,x2 ,y1 ,y2);
}
else
{
scanf("%d %d" ,&x1 ,&y1);
ans = 0;
QueryX(1 ,n ,1 ,x1 ,y1);
if(ans % 2)
printf("1\n");
else printf("0\n");
}
}
if(t) printf("\n");
}
return 0;
}
POJ2155二维线段树的更多相关文章
- POJ2155 Matrix 【二维线段树】
题目链接 POJ2155 题解 二维线段树水题,蒟蒻本想拿来养生一下 数据结构真的是有毒啊,, TM这题卡常 动态开点线段树会TLE[也不知道为什么] 直接开个二维数组反倒能过 #include< ...
- POJ2155 Matrix二维线段树经典题
题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...
- POJ2155 Matrix 二维线段树
关键词:线段树 二维线段树维护一个 维护一个X线段的线段树,每个X节点维护一个 维护一个Y线段的线段树. 注意,以下代码没有PushDownX.因为如果要这么做,PushDownX时,由于当前X节点的 ...
- 二维线段树 poj-2155
题意:t组样例 ,输入 n,m,表示n*n的矩阵进行m次操作 ,C: 输入两个坐标 ,组成的矩形 进行取反操作 ,Q:对输的坐标位置输入其值. 思路:一开始想的是用1000(表示x轴)个线段树(对每段 ...
- POJ 2155 Matrix (二维线段树)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
- UVA 11297 线段树套线段树(二维线段树)
题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要 不同的处理方式,非叶子形成的 ...
- HDU 1823 Luck and Love(二维线段树)
之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上. 二维线段树 -- 点更段查 #include <cstdio> #include <cstring> #inclu ...
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17880 Accepted: 6709 Descripti ...
- poj 1195:Mobile phones(二维线段树,矩阵求和)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14391 Accepted: 6685 De ...
随机推荐
- HDOJ-2087(KMP算法)
剪花布条 HDOJ-2087 本题和hdoj-1686相似,唯一不同的是这里的子串一定要是单独的.所以在确定有多少个子串时不能用前面的方法.而是在循环时,只要找到一个子串,i就不是++,而是+=子串的 ...
- .Net Core 处理跨域问题Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource
网页请求报错: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Or ...
- 精确率precession和召回率recall
假设有两类样本,A类和B类,我们要衡量分类器分类A的能力. 现在将所有样本输入分类器,分类器从中返回了一堆它认为属于A类的样本. 召回率:分类器认为属于A类的样本里,真正是A类的样本数,占样本集中所有 ...
- Kilo 使用教程
写了这么多篇 WireGuard 相关的保姆教程,今天终于牵扯到 Kubernetes 了,不然怎么对得起"云原生"这三个字.如果看到这篇文章的你仍然是个 WireGuard 新手 ...
- python获取到本机的公网IP
5行代码获取到本机的公网IP from urllib.request import urlopen import re text = str(urlopen("http://txt.go.s ...
- Java基础:特性write once;run anywhere!
三高:高可用 高性能 高并发 特性: 简单性 面向对象:万物皆为对象 可移植性 高性能 分布式 动态性 多线程 安全性 健壮性 Java三大版本 javaSE:标准版(桌面程序,控制台) javaME ...
- allure报告详解+jenkins配置
今天的博客分为两部分 1.allure报告实战 2.allure结合jenkins 一.allure 1.allure安装 a.下载路径 https://repo.maven.apache.org/m ...
- python inspect库
一.介绍 inspect模块用于收集python对象的信息,可以获取类或函数的参数的信息,源码,解析堆栈,对对象进行类型检查等等. inspect模块主要提供了四种用处: 对是否是模块.框架.函数进行 ...
- 最短路径(Dijskra算法)
声明:图片及内容基于:https://www.bilibili.com/video/BV16C4y1H7Zc?from=articleDetail 最短路径 Dijkstra算法 原理 数据结构 核心 ...
- 文件连接--ln
ln -n file1 file2 将文件2设置为文件1的软连接:file1和file2 任何一个改动都会反馈到另一方,删除源文件, 软连接文件不可用 ln -s file1 file2 将文件2 ...