UVA 11297 Census ——二维线段树
【题目分析】
二维线段树模板题目。
简直就是无比的暴力。时间复杂度为两个log。
标记的更新方式比较奇特,空间复杂度为N^2。
模板题目。
【代码】
#include <cstdio>
#include <cstring>
//#include <cmath>
#include <cstdlib> #include <map>
#include <set>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 505
#define inf 0x3f3f3f3f
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i) void Finout()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
} int Getint()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} int mx[maxn<<2][maxn<<2],mn[maxn<<2][maxn<<2],rt[maxn<<2],ma[maxn][maxn],n;
int x,y,c,tot=0,x1,x2,y1,y2; void pushup(int rt,int o)
{
mx[rt][o]=max(mx[rt][o<<1],mx[rt][o<<1|1]);
mn[rt][o]=min(mn[rt][o<<1],mn[rt][o<<1|1]);
} void update(int rt,int o,int l,int r)
{
// printf("update %d %d %d %d\n",rt,o,l,r);
if (l==r)
{
mx[rt][o]=max(mx[rt<<1][o],mx[rt<<1|1][o]);
mn[rt][o]=min(mn[rt<<1][o],mn[rt<<1|1][o]);
return;
}
int mid=l+r>>1;
if (y<=mid) update(rt,o<<1,l,mid);
else update(rt,o<<1|1,mid+1,r);
pushup(rt,o);
} void push(int rt,int o,int l,int r)
{
if (l==r)
{
mx[rt][o]=mn[rt][o]=c;
return ;
}
int mid=l+r>>1;
if (y<=mid) push(rt,o<<1,l,mid);
else push(rt,o<<1|1,mid+1,r);
pushup(rt,o);
} void modi(int o,int l,int r)
{
if (l==r){push(o,1,1,n);return;}
int mid=l+r>>1;
if (x<=mid) modi(o<<1,l,mid);
else modi(o<<1|1,mid+1,r);
update(o,1,1,n);
} char opt[11];int amx,amn,q; void queryy(int rt,int o,int l,int r)
{
// printf("queryy %d %d %d %d\n",rt,o,l,r);
if (y1<=l&&r<=y2)
{
amx=max(amx,mx[rt][o]);
amn=min(amn,mn[rt][o]);
return ;
}
int mid=l+r>>1;
if (y1<=mid) queryy(rt,o<<1,l,mid);
if (y2>mid) queryy(rt,o<<1|1,mid+1,r);
} void queryx(int o,int l,int r)
{
// printf("query x %d %d %d\n",o,l,r);
if (x1<=l&&r<=x2){ return queryy(o,1,1,n); }
int mid=l+r>>1;
if (x1<=mid) queryx(o<<1,l,mid);
if (x2>mid) queryx(o<<1|1,mid+1,r);
} int main()
{
memset(mx,-0x3f,sizeof mx);
memset(mn, 0x3f,sizeof mn);
Finout();
n=Getint();
F(i,1,n) F(j,1,n)
{
x=i;y=j;
c=ma[i][j]=Getint();
modi(1,1,n);
}
// cout<<mx[1][1]<<" "<<mn[1][1]<<endl;
q=Getint();
F(i,1,q)
{
scanf("%s",opt);
if (opt[0]=='c')
{
x=Getint(); y=Getint(); c=Getint();
modi(1,1,n);
}
else
{
x1=Getint(); y1=Getint(); x2=Getint(); y2=Getint();
amx=-inf,amn=inf;
queryx(1,1,n);
printf("%d %d\n",amx,amn);
}
}
}
UVA 11297 Census ——二维线段树的更多相关文章
- UVa 11297 Census (二维线段树)
题意:给定上一个二维矩阵,有两种操作 第一种是修改 c x y val 把(x, y) 改成 val 第二种是查询 q x1 y1 x2 y2 查询这个矩形内的最大值和最小值. 析:二维线段树裸板. ...
- UVA 11297 Census(二维线段树)
Description This year, there have been many problems with population calculations, since in some cit ...
- UVA 11297 线段树套线段树(二维线段树)
题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要 不同的处理方式,非叶子形成的 ...
- POJ2155 Matrix二维线段树经典题
题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...
- 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 ...
- POJ 2155 Matrix (二维线段树)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
- HDU 4819 Mosaic (二维线段树)
Mosaic Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
随机推荐
- spark-wordcount-sample算子测试
import org.apache.spark.{SparkConf, SparkContext} object radomSampleU { def main(args: Array[String] ...
- block总结我的
1) struct Block_descriptor { unsigned long int reserved; unsigned long int size; void (*copy)(void * ...
- WPF知识点全攻略07- 数据绑定(Binding)
数据绑定是WPF不得不提,不得不会系列之一 数据绑定简言之,就是把数据源的数据绑定到目标对象的属性上.目标对象可以是承自DependencyProperty的任何可访问的属性或控件,目标属性必须为依赖 ...
- ucosii(2.89)semaphore 应用要点
semaphore 的作用:1,允许一个任务与其他任务(中断)同步.2,取得共享资源使用权.3,标志事件的发生.
- CAD交互绘制mcdbsolid对象(网页版)
主要用到函数说明: _DMxDrawX::DrawSolid 绘McDbSolid对象.详细说明如下: 参数 说明 DOUBLE dX1 第一个点X DOUBLE dY1 第一个点Y DOUBLE d ...
- selenium-元素的定位
前戏 元素的定位是自动化测试的核心,要想操作一个元素,首先应该识别这个元素.Webdriver 提供了一系列的元素定位方法,常用的有 id,name,class name,link text,part ...
- 洛谷 P1032 字串变换 (BFS)
题目传送门 我即使是死了,钉在棺材里了,也要在墓里,用这腐朽的声带喊出 STL大法好 这题最麻烦的其实是处理字符串,真正的搜索部分我个人认为也就只有橙题或黄题的难度.而处理字符串,正如前面所说,STL ...
- 分布式mysql 和 zk ( zookeeper )的分布式的区别 含冷热数据讨论
zk ( zookeeper )的分布式仅仅指的是备份模式. 分布式 mysql 不仅仅要关注备份(从以往的半主,主主,到 paxos). (mysql 比 hbase 的region成熟, hdfs ...
- 使用一位数组解决 1 1 2 3 5 8 13 数列问题 斐波纳契数列 Fibonacci
斐波纳契数列 Fibonacci 输出这个数列的前20个数是什么? 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 使用数组实现输出数列的前30 ...
- ios 自定义RadioButton
1 前言 众所周知在IOS中没有单选按钮这一控件,今天我们来学习一下简单的单选控件.类似与Web中的radio表单元素. 2 详述 本控件单纯的利用按钮控件和NSObject的respondsToSe ...