http://acm.hdu.edu.cn/showproblem.php?pid=4819

给出一个N*N的矩阵,每次询问一个m*m的子矩阵里的floor((maxv+minv)/2)并把中间的元素修改为这个值。

线段树套线段树,第一层X表示对行建立的线段树,内层表示对Y也就是列建立的线段树。

分别对X和Y建立相应的函数来完成操作,当更新X树的节点时,再更新完当前X的节点的左右儿子之后,回头对X的这个节点对应的Y树进行更新,相当于X的左右儿子里的Y树来更新X的Y树,能理解这一点就很简单了。

  

 #include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define mp make_pair
#define LL long long
#define lc (id<<1)
#define rc (id<<1|1)
#define flc (fid<<1)
#define frc (fid<<1|1)
#define mid ((L+R)>>1)
const int maxn=;
int maxv[maxn<<][maxn<<];
int minv[maxn<<][maxn<<];
int a[maxn][maxn],N,x1,x2,y1,y2;
void buildY(int,int,int,int,int,int);
void buildX(int id,int L,int R){
if(L==R){
buildY(id,L,R,,,N);
}
else{
buildX(lc,L,mid);
buildX(rc,mid+,R);
buildY(id,L,R,,,N);
}
}
void buildY(int fid,int fl,int fr,int id,int L,int R){
if(L==R){
if(fl==fr)maxv[fid][id]=minv[fid][id]=a[fl][L];
else{
maxv[fid][id]=max(maxv[flc][id],maxv[frc][id]);
minv[fid][id]=min(minv[flc][id],minv[frc][id]);
}
}
else{
buildY(fid,fl,fr,lc,L,mid);
buildY(fid,fl,fr,rc,mid+,R);
maxv[fid][id]=max(maxv[fid][lc],maxv[fid][rc]);
minv[fid][id]=min(minv[fid][lc],minv[fid][rc]);
}
}
pii askY(int fid,int id,int L,int R){
if(L>=y1&&R<=y2){
return mp(maxv[fid][id],minv[fid][id]);
}
else{
if(y2<=mid) return askY(fid,lc,L,mid);
else if(y1>mid) return askY(fid,rc,mid+,R);
else{
pii pl=askY(fid,lc,L,mid),
pr=askY(fid,rc,mid+,R);
return mp(max(pl.first,pr.first),min(pl.second,pr.second));
}
}
}
pii askX(int id,int L,int R){
if(L>=x1&&R<=x2){
return askY(id,,,N);
}
else{
if(x2<=mid) return askX(lc,L,mid);
else if(x1>mid) return askX(rc,mid+,R);
else{
pii pl=askX(lc,L,mid),
pr=askX(rc,mid+,R);
return mp(max(pl.first,pr.first),min(pl.second,pr.second));
}
}
}
void updateY(int fid,int fl,int fr,int id,int L,int R,int x,int y,int v){
if(L==R){
if(fl==fr){
maxv[fid][id]=minv[fid][id]=v;
}
else{
maxv[fid][id]=max(maxv[flc][id],maxv[frc][id]);
minv[fid][id]=min(minv[flc][id],minv[frc][id]);
}
}
else{
if(y<=mid){
updateY(fid,fl,fr,lc,L,mid,x,y,v);
}
else{
updateY(fid,fl,fr,rc,mid+,R,x,y,v);
}
maxv[fid][id]=max(maxv[fid][lc],maxv[fid][rc]);
minv[fid][id]=min(minv[fid][lc],minv[fid][rc]);
}
}
void updateX(int id,int L,int R,int x,int y,int v){
if(L==R){
updateY(id,L,R,,,N,x,y,v);
}
else{
if(x<=mid) updateX(lc,L,mid,x,y,v);
else updateX(rc,mid+,R,x,y,v);
updateY(id,L,R,,,N,x,y,v);
}
}
int main()
{
int T,M,i,j,x,y,d;
scanf("%d",&T);
for(int cas=;cas<=T;++cas){
scanf("%d",&N);
for(i=;i<=N;++i){
for(j=;j<=N;++j){
scanf("%d",&a[i][j]);
}
}
buildX(,,N);
scanf("%d",&M);
printf("Case #%d:\n",cas);
while(M--){
scanf("%d%d%d",&x,&y,&d);
x1=x-d/,x2=x+d/,y1=y-d/,y2=y+d/;
x1=max(x1,),x2=min(x2,N);
y1=max(y1,),y2=min(y2,N);
pii ans=askX(,,N);
updateX(,,N,x,y,(ans.first+ans.second)/);
printf("%d\n",(ans.first+ans.second)/);
}
}
return ;
}

hdu-4819-线段树套线段树的更多相关文章

  1. bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1807  Solved: 772[Submit][Stat ...

  2. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  3. ZJOI 2017 树状数组(线段树套线段树)

    题意 http://uoj.ac/problem/291 思路 不难发现,九条カレン醬所写的树状数组,在查询区间 \([1,r]\) 的时候,其实在查询后缀 \([r,n]\) :在查询 \([l,r ...

  4. BZOJ4317Atm的树&BZOJ2051A Problem For Fun&BZOJ2117[2010国家集训队]Crash的旅游计划——二分答案+动态点分治(点分树套线段树/点分树+vector)

    题目描述 Atm有一段时间在虐qtree的题目,于是,他满脑子都是tree,tree,tree…… 于是,一天晚上他梦到自己被关在了一个有根树中,每条路径都有边权,一个神秘的声音告诉他,每个点到其他的 ...

  5. dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448

    4448: [Scoi2015]情报传递 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 588  Solved: 308[Submit][Status ...

  6. 【vijos】1750 建房子(线段树套线段树+前缀和)

    https://vijos.org/p/1750 是不是我想复杂了.... 自己yy了个二维线段树,然后愉快的敲打. 但是wa了两法.......sad 原因是在处理第二维的更新出现了个小问题,sad ...

  7. [TJOI2017][bzoj4889] 不勤劳的图书管理员 [线段树套线段树]

    题面 传送门 思路 考虑两本书的位置交换对答案的贡献: (为了方便描述,用"左边那本"和"右边那本"称呼两本我们要交换的书,"中间那本"是我 ...

  8. 【bzoj4785】[Zjoi2017]树状数组 线段树套线段树

    题目描述 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作 ...

  9. BZOJ1901 ZOJ2112 线段树+treap (线段树套线段树)

    BZOJ1901: 线段树套线段树做法: (外层线段树 里层动态开节点的权值线段树) 有一个小小的trick 可以省掉二分变成nlog^2n的 就是把查询的区间都取出来- logn个一起走- 2016 ...

随机推荐

  1. Unity3D学习笔记(三十三):矩阵

    矩阵 矩阵就是一行和列组织起来的矩形数字块. 矩阵可以理解为是向量的数组.   矩阵的维度和记法 矩阵的维度是包含多少行多少列!例如1行2列的矩阵 记法:矩阵m中,对于第1行第2列的元素,我们记为m1 ...

  2. Docker之Swarm

    Docker学习笔记 — Swarm搭建Docker集群 Swarm在schedule节点运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread, binpack, ...

  3. IDEA入门级使用教程----你怎么还在用eclipse?

    http://blog.csdn.net/qq_31655965/article/details/52788374

  4. 4、python内置类型(0529)

    支持运算:索引,切片,min(), max(), len()等 支持操作:对象的自有的方法 对字符串操作的内置方法获取:str.     //敲tab键补全 获取某个内建命令的属性和方法列表:dir( ...

  5. Oracle spatial、openlayers、geoserver开发地理信息系统总结

    感谢开源,使用OpenLayers+Geoserver的地理信息系统开发很简单,完全可以套用开发MIS系统的经验,我这里总结为三个步骤: 1.数据准备 2.数据发布 3.数据展现 我将按照这个思路来介 ...

  6. C# linq 最大、最小对象的扩展

    public static class LinqExtension { public static T MaxBy<T, TR>(this IEnumerable<T> en, ...

  7. C# 用面向对象的思想去编程

    再接上一篇博文,之前写的两篇博文虽然实现了功能,但是和控件之间的粘性太大,依赖于控件进行操作,所以这篇博文主要用面向对象的思想做一个Demo,将逻辑层与显示层剥离开 首先新建一个窗体文件,搭建界面完毕 ...

  8. Springboot Thymeleaf 发邮件 将html内容展示在邮件内容中

  9. django 消息框架 message

    在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户. 对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证的用户 ...

  10. [原][osg][osgearth]倾斜摄影2.文件格式分析:OSGB

    倾斜摄影三维模型格式包含:*.osgb,*.dae等 文件格式包含:*.xml, *.desc, *.lfp等 例如:LocaSpace Viewer软件把osgb分块模型文件建立索引生成一个lfp文 ...