HDU4819 Mosaic【树套树】
题目大意
给你一个\(n*n\)矩阵,每个点有初始权值
q次询问每次把一个矩形的中心节点变成这个矩形中最大值和最小值的平均数
思路
很显然的树套树啊
就是一开始傻逼了没想到怎么去维护这个东西
其实很简单
对于每个内层树,如果属于外层树的叶子节点,那么可以直接暴力更新,复杂度\(O(log(n))\)
void modify_y(int t, int l, int r, int pos, int vl, int id) {
if (l == r) {
minv[id][t] = vl;
maxv[id][t] = vl;
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) modify_y(LD(t), l, mid, pos, vl, id);
else modify_y(RD(t), mid + 1, r, pos, vl, id);
pushup(t, id);
}
然后如果要更新不是叶子节点外层树对应的内层树怎么办?
考虑从外层树的儿子节点合并对应的信息,只需要修改有影响的一条链,复杂度\(O(nlog(n))\)
void update_y(int t, int l, int r, int pos, int id) {
if (l == r) {
minv[id][t] = min(minv[LD(id)][t], minv[RD(id)][t]);
maxv[id][t] = max(maxv[LD(id)][t], maxv[RD(id)][t]);
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) update_y(LD(t), l, mid, pos, id);
else update_y(RD(t), mid + 1, r, pos, id);
pushup(t, id);
}
内层树的查询就简单而套路了
pi query_y(int t, int l, int r,int ql, int qr, int id) {
if (ql <= l && r <= qr) return pi(maxv[id][t], minv[id][t]);
int mid = (l + r) >> 1;
if (qr <= mid) return query_y(LD(t), l, mid, ql, qr, id);
else if (ql > mid) return query_y(RD(t), mid + 1, r, ql, qr, id);
else {
pi ansl = query_y(LD(t), l, mid, ql, mid, id);
pi ansr = query_y(RD(t), mid + 1, r, mid + 1, qr, id);
return pi(max(ansl.first, ansr.first), min(ansl.second, ansr.second));
}
}
外层树修改的时候需要判断一下当前节点是不是叶子,如果是叶子直接更新y
否则先递归问题再调用\(update_y\)函数
void modify_x(int t, int l, int r, int x, int y, int vl) {
if (l == r) {
modify_y(1, 1, n, y, vl, t);
return;
}
int mid = (l + r) >> 1;
if (x <= mid) modify_x(LD(t), l, mid, x, y, vl);
else modify_x(RD(t), mid + 1, r, x, y, vl);
update_y(1, 1, n, y, t);
}
外层树的查询就是如果被查询区间包含调用内层查询,否则递归问题
pi query_x(int t, int l, int r, int xl, int xr, int yl, int yr) {
if (xl <= l && r <= xr) return query_y(1, 1, n, yl, yr, t);
int mid = (l + r) >> 1;
if (xr <= mid) return query_x(LD(t), l, mid, xl, xr, yl, yr);
else if (xl > mid) return query_x(RD(t), mid + 1, r, xl, xr, yl, yr);
else {
pi ansl = query_x(LD(t), l, mid, xl, mid, yl, yr);
pi ansr = query_x(RD(t), mid + 1, r, mid + 1, xr, yl, yr);
return pi(max(ansl.first, ansr.first), min(ansl.second, ansr.second));
}
}
HDU4819 Mosaic【树套树】的更多相关文章
- hdu 4819 Mosaic 树套树 模板
The God of sheep decides to pixelate some pictures (i.e., change them into pictures with mosaic). He ...
- 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的元素的个数. 好像函数式线段树可 ...
随机推荐
- testng生成报告ReportNG美化测试报告
testng生成报告ReportNG美化测试报告 testng生成报告ReportNG美化测试报告 ReportNG 是一个配合TestNG运行case后自动帮你在test-output文件内生成一个 ...
- VirtualXposed查看手机端网页及调试
参考博客: https://sspai.com/post/44447 以下是实际动手操作步骤: 一 打开手机开发者模式 二 允许USB调试 三 安装 VirtualXposed_1.apk ...
- Spring-Boot 中 Redis 的简单使用以及简单模糊匹配删除
https://yulaiz.com/spring-boot-redis-simple/
- SQL学习笔记三之MySQL表操作
阅读目录 一 存储引擎介绍 二 表介绍 三 创建表 四 查看表结构 五 数据类型 六 表完整性约束 七 修改表ALTER TABLE 八 复制表 九 删除表 一 存储引擎介绍 存储引擎即表类型,mys ...
- bzoj1601 / P1550 [USACO08OCT]打井Watering Hole(堆优化prim)
P1550 [USACO08OCT]打井Watering Hole 对于自己建水库的情况,新建一个虚拟结点,和其他点的边权即为自建水库的费用 这样问题就转化为一个裸最小生成树问题了. 这里用堆优化 ...
- Element-UI中Upload上传文件前端缓存处理
Element-UI对于文件上传组件的功能点着重于文件传递到后台处理,所以要求action为必填属性.但是如果需要读取本地文件并在前端直接处理,文件就没有必要传递到后台,比如在本地打开一个JSON文件 ...
- 构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)
构建一个简单的Linux系统 MenuOs —— start_kernel到init进程 作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study ...
- Ubuntu16.04 安装JDK Tomcat
Ubuntu16.04安装jdk,下载linux中的64版本 需要下载jdk,tomcat安装包 tar.gz版本的 http://pan.baidu.com/s/1mi4WVhA 安装JDK: ho ...
- HDU 4272 LianLianKan (状压DP+DFS)题解
思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...
- HDU 5950 Recursive sequence(矩阵快速幂)题解
思路:一开始不会n^4的推导,原来是要找n和n-1的关系,这道题的MOD是long long 的,矩阵具体如下所示 最近自己总是很坑啊,代码都瞎吉坝写,一个long long的输入写成%d一直判我TL ...