UVALive - 6709树套树
题意:给你一个矩阵,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树套树的更多相关文章
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- 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 ...
- bzoj3262: 陌上花开(树套树)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- bzoj3295: [Cqoi2011]动态逆序对(树套树)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- BZOJ 3110 k大数查询 & 树套树
题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...
- BZOJ 3110 树套树 && 永久化标记
感觉树套树是个非常高深的数据结构.从来没写过 #include <iostream> #include <cstdio> #include <algorithm> ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...
- hdu 4417 Super Mario/树套树
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意很简单,给定一个序列求一个区间 [L, R,]中小于等于H的元素的个数. 好像函数式线段树可 ...
- 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 ...
随机推荐
- 细说PHP7
PHP7带来的新东西 1.类型的声明. 可以使用字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool),来声明函数的参数类型与函数返回值. declare(s ...
- C# 将 HTML 转换为图片或 PDF
首先是把 HTML 转换为图片. public partial class Form1 : Form { public Form1() { InitializeComponent(); } WebBr ...
- display、box-sizing,position有哪些值?
display有哪些值? none 此元素不会被显示. block 此元素将显示为块级元素,此元素前后会带有换行符. inline 默认.此元素会被显示为内联元素,元素前后没有换行符. inline- ...
- JavaScript之从头再来
引入文件 1. 引入外部文件 <script type="text/javascript" src="JS文件"></script> 2 ...
- usermod命令、用户密码管理、mkpasswd命令
3.4 usermod命令--更改用户帐户属性 -a|--append ##把用户追加到某些组中,仅与-G选项一起使用 -G|--groups ##把用户追加到某些组中,仅与-a选项一起使用:把该用户 ...
- 对Docker的一点理解
Docker是什么? Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来.并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会相互影响.那么就不需要专门 ...
- ansible playbook部署ELK集群系统
一.介绍 总共4台机器,分别为 192.168.1.99 192.168.1.100 192.168.1.210 192.168.1.211 服务所在机器为: redis:192.168.1.211 ...
- Ubuntu14.04+caffe+cuda7.5 环境搭建以及MNIST数据集的训练与测试
Ubuntu14.04+caffe+cuda 环境搭建以及MNIST数据集的训练与测试 一.ubuntu14.04的安装: ubuntu的安装是一件十分简单的事情,这里给出一个参考教程: http:/ ...
- linux上mysql访问:Access denied for user 'agtipay'@'iZm5ebiyb4f90ga9xiycgsZ' (using password: YES)
公司的聚合支付测试环境出了一个问题(agtipay用户访问数据的时候出现如题错误),快搞死我两天时间(原谅技术不才),如题.首先明确一下问题: 1.访问拒绝,说明数据库连接这里有问题,数据库连接访问拒 ...
- 【WPF】修改ComboBox样式
修改WPF默认的ComboBox控件样式 如下图所示: 修改代码如下: <UserControl.Resources> <Style TargetType="ToggleB ...