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的元素的个数. 好像函数式线段树可 ...
随机推荐
- LCS 最长公共子子串
与 最长公共子序列类似 只是最长公共子串必须连续 所以只能走斜线!!!! ''' LCS 最长公共子序列 ''' def LCS_len(x, y): m = len(x) n = len(y) dp ...
- ZOJ Monthly, January 2018 Solution
A - Candy Game 水. #include <bits/stdc++.h> using namespace std; #define N 1010 int t, n; int a ...
- 大喜python版opencv3发布,demo脚本抢鲜版发布
大喜,python版opencv3发布 zwPython3的升级也可以启动了,一直在等这个,zwPython会直接升级到版本3:zwPython3 zwPython3采用64位python3,支持op ...
- jmeter -xml日志格式中网络时间与服务器时间的区分
在 LR 中是有一个“网页细分图”的,通过这个图,你可以比较容易的区分哪些请求的响应时间最长,如果响应时间过程,是消耗在server处理的时候,还是消耗在网络传输过程中——也就是所谓的 Server ...
- python 解析xml遇到xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 4, column 34
在调试数字驱动用xml文件的方式时,包含读取xml文件的步骤,运行程序报错: d:\test\0629>python XmlUtil.pyTraceback (most recent call ...
- mssql语句递归查找所有下级
if exists (select * from sys.all_objects where name='GetOrgTree') begin drop function GetOrgTree end ...
- 根据Bootstrap的Modal开发的提示框
代码: (function ($) { $(function () { var Modal = function () { var htmlContent = "<div id=\&q ...
- KMP&拓展KMP
KMP算法 说明 KMP算法是一种比较高效的字符串匹配算法,可以在线性时间内求出一个串在另一个串的所有匹配位置. 解析 详解KMP 设模板串是 \(pattern\) 令 \(next[i] = ma ...
- Gym 101147J Whistle's New Car(dfs)
https://vjudge.net/problem/Gym-101147J 题意: 有n个城市,每个城市有一个权值,表示在这个城市的加油站可以加多少油. 现在要计算每个城市i,有多少个城市j可以到达 ...
- python 在列表中添加元组元素,按照元组第一个值进行排序
>>> import bisect >>> scores = [(, , , , 'python')] >>> bisect.insort(sco ...