题意:给你一个矩阵,q次操作,每次查询长宽l的矩阵最大值a和最小值b,然后把中间点换成floor((a+b)/2),

解法:暴力可过,建n颗线段树暴力更新,但是正解应该是树套树,树套树需要注意的是当建树或修改时pushup操作不能直接搞,要先判断是不是外面层的叶子节点,如果是直接修改,如果不是,应该是从外面层的对应子节点更新过来,因为此时的外层树维护的是x轴区间最大和区间最小,需要从x轴两个更小的区间树合并起来更新

//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; int c[N][N],n;
struct segtreeinsegtree{
int ma[N<<][N<<],mi[N<<][N<<];
bool leaf;
void pushupx(int id,int rt)
{
ma[id][rt]=max(ma[id<<][rt],ma[id<<|][rt]);
mi[id][rt]=min(mi[id<<][rt],mi[id<<|][rt]);
}
void pushupy(int id,int rt)
{
ma[id][rt]=max(ma[id][rt<<],ma[id][rt<<|]);
mi[id][rt]=min(mi[id][rt<<],mi[id][rt<<|]);
}
void buildy(int id,int x,int l,int r,int rt)
{
if(l==r)
{
if(leaf)ma[id][rt]=mi[id][rt]=c[x][l];
else pushupx(id,rt);//,printf("%d %d %d %d\n",id,x,ma[id][rt]);
return ;
}
int m=(l+r)>>;
buildy(id,x,ls);buildy(id,x,rs);
pushupy(id,rt);
}
void buildx(int xl,int xr,int rt,int yl,int yr)
{
if(xl==xr){leaf=;buildy(rt,xl,yl,yr,);return ;}
int m=(xl+xr)>>;
buildx(xl,m,rt<<,yl,yr);
buildx(m+,xr,rt<<|,yl,yr);
leaf=,buildy(rt,xl,yl,yr,);
}
void updatey(int id,int posx,int posy,int c,int l,int r,int rt)
{
if(l==r)
{
if(leaf)ma[id][rt]=mi[id][rt]=c;
else pushupx(id,rt);
return ;
}
int m=(l+r)>>;
if(posy<=m)updatey(id,posx,posy,c,ls);
else updatey(id,posx,posy,c,rs);
pushupy(id,rt);
}
void updatex(int posx,int posy,int c,int l,int r,int rt)
{
if(l==r){leaf=;updatey(rt,posx,posy,c,,n,);return ;}
int m=(l+r)>>;
if(posx<=m)updatex(posx,posy,c,ls);
else updatex(posx,posy,c,rs);
leaf=,updatey(rt,posx,posy,c,,n,);
}
int querymay(int id,int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)return ma[id][rt];
int m=(l+r)>>,ans=;
if(L<=m)ans=max(ans,querymay(id,L,R,ls));
if(m<R)ans=max(ans,querymay(id,L,R,rs));
return ans;
}
int querymax(int xl,int xr,int yl,int yr,int l,int r,int rt)
{
if(xl<=l&&r<=xr){return querymay(rt,yl,yr,,n,);}
int m=(l+r)>>,ans=;
if(xl<=m)ans=max(ans,querymax(xl,xr,yl,yr,ls));
if(m<xr)ans=max(ans,querymax(xl,xr,yl,yr,rs));
return ans;
}
int querymiy(int id,int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)return mi[id][rt];
int m=(l+r)>>,ans=1e9+;
if(L<=m)ans=min(ans,querymiy(id,L,R,ls));
if(m<R)ans=min(ans,querymiy(id,L,R,rs));
return ans;
}
int querymix(int xl,int xr,int yl,int yr,int l,int r,int rt)
{
if(xl<=l&&r<=xr)return querymiy(rt,yl,yr,,n,);
int m=(l+r)>>,ans=1e9+;
if(xl<=m)ans=min(ans,querymix(xl,xr,yl,yr,ls));
if(m<xr)ans=min(ans,querymix(xl,xr,yl,yr,rs));
return ans;
}
int query(int x,int y,int l)
{
int xl=max(,x-l/),xr=min(n,x+l/);
int yl=max(,y-l/),yr=min(n,y+l/);
int ma=querymax(xl,xr,yl,yr,,n,);
int mi=querymix(xl,xr,yl,yr,,n,);
// printf("%d %d\n",ma,mi);
int ans=floor(1.0*(ma+mi)/);
updatex(x,y,ans,,n,);
return ans;
}
void debug(int id,int l,int r,int rt)
{
printf("%d %d %d %d\n",l,r,ma[id][rt],mi[id][rt]);
if(l==r)return ;
int m=(l+r)>>;
debug(id,ls);debug(id,rs);
}
}s;
int main()
{
int T,cnt=;scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&c[i][j]);
s.buildx(,n,,,n);
// s.debug(5,1,n,1);
int q;scanf("%d",&q);
printf("Case #%d:\n",++cnt);
while(q--)
{
int x,y,l;
scanf("%d%d%d",&x,&y,&l);
printf("%d\n",s.query(x,y,l));
}
}
return ;
}
/***********************
1
3
1 2 3
4 5 6
7 8 9
5
2 2 1
***********************/

UVALive - 6709树套树的更多相关文章

  1. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  2. BZOJ4170 极光(CDQ分治 或 树套树)

    传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...

  3. bzoj3262: 陌上花开(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  4. bzoj3295: [Cqoi2011]动态逆序对(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  5. BZOJ 3110 k大数查询 & 树套树

    题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...

  6. BZOJ 3110 树套树 && 永久化标记

    感觉树套树是个非常高深的数据结构.从来没写过 #include <iostream> #include <cstdio> #include <algorithm> ...

  7. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...

  8. hdu 4417 Super Mario/树套树

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意很简单,给定一个序列求一个区间 [L, R,]中小于等于H的元素的个数. 好像函数式线段树可 ...

  9. Uva 3767 Dynamic len(set(a[L:R])) 树套树

    Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...

随机推荐

  1. CCF 201312-3 最大的矩形[比较简单]

    问题描述 试题编号: 201312-3 试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ ...

  2. django连接mongodb mongoengine

    优点 MongoEngine (http://mongoengine.org)1. 提供了和 Django 原生 ORM 几乎一样的一切,功能已经相当强大;2. 用起来比 Django 原生 ORM ...

  3. SQL Server 自定义函数(Function)——参数默认值

    sql server 自定义函数分为三种类型:标量函数(Scalar Function).内嵌表值函数(Inline Function).多声明表值函数(Multi-Statement Functio ...

  4. hash值是啥,单页面应用的实质

    1.什么hash Location hash属性,http://www.runoob.com/jsref/prop-loc-hash.html,hash 属性是一个可读可写的字符串,该字符串是 URL ...

  5. 腾讯 微信春招nlp实习生一面二面(猝)

    一面: 1.算法题: 1 28数组中出现次数超过一半的数字 2 手写快排:八大排序算法总结(2) 2.项目介绍: 大多都是项目中涉及到的技术. TFIDF 的原理 word2vec的原理 3.算法原理 ...

  6. Jquery Easy UI Datagrid 上下移动批量保存数据

    DataGrid with 上下移动批量保存数据 通过前端变量保存修改数据集合,一次性提交后台执行 本想结合easyui 自带的$('#dg').datagrid('getChanges'); 方法来 ...

  7. linux pip 查看版本提示

    After upgrading pip (or pip3, in this case) if the following occurs: $ ~ pip3 -V Traceback (most rec ...

  8. Redis学习笔记之Redis中5种数据结构的使用场景介绍

    原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 redis 中一共有5种数据结构 ...

  9. Linux学习笔记之CentOS6.9 防火墙的关闭以及开启

    有的时候,我们需要对系统的防火墙进行操作,今天小编就给大家讲解一下如何开启以及关闭CentOS6.9系统下的防火墙. 输入:cat /etc/issue   查看版本 (一)通过service命令 s ...

  10. [HAOI2017模拟]百步穿杨

    今天的考试题. 考试的时候因为以前做过还写过题解,然后就以为模型已经很清楚了,然后就开始直接推.最后因为蜜汁自信一定能推出来,然后模型搞错了,只能交个暴力上去,于是这场考试GG. 第一次碰上这道题是在 ...