LINK

题目大意

给你一个\(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【树套树】的更多相关文章

  1. hdu 4819 Mosaic 树套树 模板

    The God of sheep decides to pixelate some pictures (i.e., change them into pictures with mosaic). He ...

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

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

  3. 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 ...

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

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

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

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

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

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

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

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

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

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

  9. hdu 4417 Super Mario/树套树

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

随机推荐

  1. 1.2 Getting Started--Naming Conventions(命名约定)

    Ember.js使用一个运行时解析器去连接你的对象而没有很多样板文件.作为一个开发者,如果你把code放到约定好的位置这个解析器会自动工作.   一.The Application     1. 当你 ...

  2. C++中的RAII介绍 资源管理

    摘要 RAII技术被认为是C++中管理资源的最佳方法,进一步引申,使用RAII技术也可以实现安全.简洁的状态管理,编写出优雅的异常安全的代码. 资源管理 RAII是C++的发明者Bjarne Stro ...

  3. Yahoo Programming Contest 2019

    A - Anti-Adjacency 签. #include <bits/stdc++.h> using namespace std; int main() { int n, k; whi ...

  4. 2018年浙江中医药大学程序设计竞赛 Solution

    Problem A. Jhadgre的C语言程序 签. #include <bits/stdc++.h> using namespace std; int main() { puts(&q ...

  5. MyEclipse优化,解决MyEclipse运行慢、卡顿问题

    工具: myeclipse2015 2.0 最近想用myeclipse做一下测试,发现myeclipse运行非常卡,直接影响代码的开发,而且还出现软件卡退的情况,让我十分恼火.   一.加大JVM的非 ...

  6. JSDoc 注释规范

    命令名描述 @param @argument 指定参数名和说明来描述一个函数参数@returns 描述函数的返回值@author 指示代码的作者@deprecated 指示一个函数已经废弃,而且在将来 ...

  7. Linux内核参数之arp_ignore和arp_announce

    一.arp_ignore和arp_announce介绍 arp_ignore和arp_announce参数都和ARP协议相关,主要用于控制系统返回arp响应和发送arp请求时的动作.这两个参数很重要, ...

  8. 常用php操作redis命令整理(二)哈希类型

    HSET将哈希表key中的域field的值设为value;如果field是哈希表中的一个新建域,并且值设置成功,返回1;如果哈希表中域field已经存在且旧值已被新值覆盖,返回0. <?php ...

  9. Android用PhoneGap封装webapp在android代码中实现连按退出和loadingpage

    用PhoneGap封装后的程序有一些瑕疵,比如启动时黑屏,菜单按钮和返回按钮不好控制等. PhoneGap也在github提交的它的源码(版本:2.8): https://github.com/apa ...

  10. linux第四章读书笔记

    第四章 进程调度 一.多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵塞或者睡眠状态,实际不被投入执行,这些任务尽管位于内存,但是并不处于可运行状态.多 ...