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

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

  1. //#pragma comment(linker, "/stack:200000000")
  2. //#pragma GCC optimize("Ofast,no-stack-protector")
  3. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  4. //#pragma GCC optimize("unroll-loops")
  5. #include<bits/stdc++.h>
  6. #define fi first
  7. #define se second
  8. #define mp make_pair
  9. #define pb push_back
  10. #define pi acos(-1.0)
  11. #define ll long long
  12. #define vi vector<int>
  13. #define mod 1000000007
  14. #define C 0.5772156649
  15. #define ls l,m,rt<<1
  16. #define rs m+1,r,rt<<1|1
  17. #define pil pair<int,ll>
  18. #define pli pair<ll,int>
  19. #define pii pair<int,int>
  20. #define cd complex<double>
  21. #define ull unsigned long long
  22. #define base 1000000000000000000
  23. #define fio ios::sync_with_stdio(false);cin.tie(0)
  24.  
  25. using namespace std;
  26.  
  27. const double g=10.0,eps=1e-;
  28. const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;
  29.  
  30. int c[N][N],n;
  31. struct segtreeinsegtree{
  32. int ma[N<<][N<<],mi[N<<][N<<];
  33. bool leaf;
  34. void pushupx(int id,int rt)
  35. {
  36. ma[id][rt]=max(ma[id<<][rt],ma[id<<|][rt]);
  37. mi[id][rt]=min(mi[id<<][rt],mi[id<<|][rt]);
  38. }
  39. void pushupy(int id,int rt)
  40. {
  41. ma[id][rt]=max(ma[id][rt<<],ma[id][rt<<|]);
  42. mi[id][rt]=min(mi[id][rt<<],mi[id][rt<<|]);
  43. }
  44. void buildy(int id,int x,int l,int r,int rt)
  45. {
  46. if(l==r)
  47. {
  48. if(leaf)ma[id][rt]=mi[id][rt]=c[x][l];
  49. else pushupx(id,rt);//,printf("%d %d %d %d\n",id,x,ma[id][rt]);
  50. return ;
  51. }
  52. int m=(l+r)>>;
  53. buildy(id,x,ls);buildy(id,x,rs);
  54. pushupy(id,rt);
  55. }
  56. void buildx(int xl,int xr,int rt,int yl,int yr)
  57. {
  58. if(xl==xr){leaf=;buildy(rt,xl,yl,yr,);return ;}
  59. int m=(xl+xr)>>;
  60. buildx(xl,m,rt<<,yl,yr);
  61. buildx(m+,xr,rt<<|,yl,yr);
  62. leaf=,buildy(rt,xl,yl,yr,);
  63. }
  64. void updatey(int id,int posx,int posy,int c,int l,int r,int rt)
  65. {
  66. if(l==r)
  67. {
  68. if(leaf)ma[id][rt]=mi[id][rt]=c;
  69. else pushupx(id,rt);
  70. return ;
  71. }
  72. int m=(l+r)>>;
  73. if(posy<=m)updatey(id,posx,posy,c,ls);
  74. else updatey(id,posx,posy,c,rs);
  75. pushupy(id,rt);
  76. }
  77. void updatex(int posx,int posy,int c,int l,int r,int rt)
  78. {
  79. if(l==r){leaf=;updatey(rt,posx,posy,c,,n,);return ;}
  80. int m=(l+r)>>;
  81. if(posx<=m)updatex(posx,posy,c,ls);
  82. else updatex(posx,posy,c,rs);
  83. leaf=,updatey(rt,posx,posy,c,,n,);
  84. }
  85. int querymay(int id,int L,int R,int l,int r,int rt)
  86. {
  87. if(L<=l&&r<=R)return ma[id][rt];
  88. int m=(l+r)>>,ans=;
  89. if(L<=m)ans=max(ans,querymay(id,L,R,ls));
  90. if(m<R)ans=max(ans,querymay(id,L,R,rs));
  91. return ans;
  92. }
  93. int querymax(int xl,int xr,int yl,int yr,int l,int r,int rt)
  94. {
  95. if(xl<=l&&r<=xr){return querymay(rt,yl,yr,,n,);}
  96. int m=(l+r)>>,ans=;
  97. if(xl<=m)ans=max(ans,querymax(xl,xr,yl,yr,ls));
  98. if(m<xr)ans=max(ans,querymax(xl,xr,yl,yr,rs));
  99. return ans;
  100. }
  101. int querymiy(int id,int L,int R,int l,int r,int rt)
  102. {
  103. if(L<=l&&r<=R)return mi[id][rt];
  104. int m=(l+r)>>,ans=1e9+;
  105. if(L<=m)ans=min(ans,querymiy(id,L,R,ls));
  106. if(m<R)ans=min(ans,querymiy(id,L,R,rs));
  107. return ans;
  108. }
  109. int querymix(int xl,int xr,int yl,int yr,int l,int r,int rt)
  110. {
  111. if(xl<=l&&r<=xr)return querymiy(rt,yl,yr,,n,);
  112. int m=(l+r)>>,ans=1e9+;
  113. if(xl<=m)ans=min(ans,querymix(xl,xr,yl,yr,ls));
  114. if(m<xr)ans=min(ans,querymix(xl,xr,yl,yr,rs));
  115. return ans;
  116. }
  117. int query(int x,int y,int l)
  118. {
  119. int xl=max(,x-l/),xr=min(n,x+l/);
  120. int yl=max(,y-l/),yr=min(n,y+l/);
  121. int ma=querymax(xl,xr,yl,yr,,n,);
  122. int mi=querymix(xl,xr,yl,yr,,n,);
  123. // printf("%d %d\n",ma,mi);
  124. int ans=floor(1.0*(ma+mi)/);
  125. updatex(x,y,ans,,n,);
  126. return ans;
  127. }
  128. void debug(int id,int l,int r,int rt)
  129. {
  130. printf("%d %d %d %d\n",l,r,ma[id][rt],mi[id][rt]);
  131. if(l==r)return ;
  132. int m=(l+r)>>;
  133. debug(id,ls);debug(id,rs);
  134. }
  135. }s;
  136. int main()
  137. {
  138. int T,cnt=;scanf("%d",&T);
  139. while(T--)
  140. {
  141. scanf("%d",&n);
  142. for(int i=;i<=n;i++)
  143. for(int j=;j<=n;j++)
  144. scanf("%d",&c[i][j]);
  145. s.buildx(,n,,,n);
  146. // s.debug(5,1,n,1);
  147. int q;scanf("%d",&q);
  148. printf("Case #%d:\n",++cnt);
  149. while(q--)
  150. {
  151. int x,y,l;
  152. scanf("%d%d%d",&x,&y,&l);
  153. printf("%d\n",s.query(x,y,l));
  154. }
  155. }
  156. return ;
  157. }
  158. /***********************
  159. 1
  160. 3
  161. 1 2 3
  162. 4 5 6
  163. 7 8 9
  164. 5
  165. 2 2 1
  166. ***********************/

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. Apache配置虚拟主机的三种方法(基于IP、端口、域名)

    1 Apache虚拟主机的实现方式有3种. 基于IP的虚拟主机 基于端口的虚拟主机 基于域名的虚拟主机 2.1 启用虚拟主机的准备工作 2.1.1安装httpd [root@mail httpd]# ...

  2. python16_day24【restful、crm表构、认证】

    一.restful 1. pip install djangorestframework 2.settings.py INSTALLED_APPS = ( ... 'rest_framework', ...

  3. CCF 炉石传说(模拟)

    试题编号: 201612-3 试题名称: 炉石传说 时间限制: 1.0s 内存限制: 256.0MB 问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes of Wa ...

  4. javascript 理解对象--- 属性类型

    ECMA-262 把对象定义为:无序属性的集合,其属性可以包含基本值.对象或者函数: var Person = { name:"wsc", age :"25", ...

  5. Hadoop2.0环境搭建

    需准备的前提条件: 1. 安装JDK(自行安装) 2. 关闭防火墙(centos): systemctl stop firewalld.service systemctl disable firewa ...

  6. $Linux vi/vim编辑器常用命令与用法总结 (Markdown编辑版)

    vi/vim是什么? Linux世界几乎所有的配置文件都是以纯文本形式存在的,而在所有的Linux发行版系统上都有vi编辑器,因此利用简单的文字编辑软件就能够轻松地修改系统的各种配置了,非常方便.vi ...

  7. IDEA 编译报错: 未结束的字符串文字

    最近在搞新项目,同事用的eclipse开发,而我用的是ide,项目初始是由同事创建的,项目编码是UTF-8,而我开发的ide工具默认是GBK编码,导致在编译的时候报错: 未结束的字符串文字 这个问题就 ...

  8. windows AD域安装及必要设置

    一.安装AD域 运行dcpromo命令,安装AD域. 步骤: 1.win+R 2.dcpromo 图例: 百度百科关于“dcpromo”解释: dcpromo命令是一个“开关”命令.如果Windows ...

  9. Centos下Nginx配置WEB访问日志并结合shell脚本定时切割

    在一个成熟的WEB系统里,没有日志管理是不可以的,有了日志,可以帮助你得到用户地域来源.跳转来源.使用终端.某个URL访问量等相关信息:通过错误日志,你可以得到系统某个服务或server的性能瓶颈等. ...

  10. 【ES6】改变 JS 内置行为的代理与反射

    代理(Proxy)可以拦截并改变 JS 引擎的底层操作,如数据读取.属性定义.函数构造等一系列操作.ES6 通过对这些底层内置对象的代理陷阱和反射函数,让开发者能进一步接近 JS 引擎的能力. 一.代 ...