树套树:

本质:一棵树的每个节点套着另一棵树

通常时间复杂度:O(nlog²n)

空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²)

但事实上,若是动态申请,对于一般题目来讲,是不会占用这么多空间的,例如题目有m次更新,显然每次更新最多只用新建log²n个节点,空间复杂度O(mlog²n)

一般来讲第一层都是线段树

3110: [Zjoi2013]K大数查询

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 9100  Solved: 2712
[Submit][Status][Discuss]

Description

有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c
如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。

Input

第一行N,M
接下来M行,每行形如1 a b c或2 a b c

Output

输出每个询问的结果

Sample Input

2 5
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3

Sample Output

1
2
1

题解:

线段树套线段树

第一层是权值线段树,每个节点只存储在范围[l, r]内值的状态

第二层是区间线段树,每个节点储存在[l', r']内有多少个数

总体来讲就是每个节点存储区间[l', r']内有多少个范围在[l, r]内的数

题目的数据范围是-n<=x<=n,理论上要离散化的,并且加强过数据,可是没离散化还是过了。。。

注意要用无符号整型,而且lazy标记最好不要更新

除此之外,第k大即第n-k+1小

#include<stdio.h>
#include<algorithm>
using namespace std;
#define uint unsigned int
uint n, cnt, root[200005], tre[6400005], lt[6400005], rt[6400005], lazy[6400005];
void Update2(uint &now, uint l, uint r, uint L, uint R)
{uint m;if(now==0)now = ++cnt;if(l>=L && r<=R){lazy[now]++;tre[now] += r-l+1;return;}m = (l+r)/2;if(L<=m)Update2(lt[now], l, m, L, R);if(R>=m+1)Update2(rt[now], m+1, r, L, R);tre[now] = tre[lt[now]]+tre[rt[now]]+lazy[now]*(r-l+1);
}
void Update1(uint l, uint r, uint x, uint L, uint R, uint k)
{uint m;Update2(root[x], 1, n, L, R);if(l==r)return;m = (l+r)/2;if(k<=m)Update1(l, m, x*2, L, R, k);elseUpdate1(m+1, r, x*2+1, L, R, k);
}
uint Query2(uint now, uint l, uint r, uint L, uint R)
{uint m, sum;sum = 0;if(now==0)return 0;if(l>=L && r<=R)return tre[now];m = (l+r)/2;if(L<=m)sum += Query2(lt[now], l, m, L, R);if(R>=m+1)sum += Query2(rt[now], m+1, r, L, R);return sum+lazy[now]*(min(R, r)-max(L, l)+1);
}
uint Query1(uint l, uint r, uint x, uint L, uint R, uint k)
{uint m, sum;if(l==r)return l;m = (l+r)/2;sum = Query2(root[x*2], 1, n, L, R);if(sum>=k)return Query1(l, m, x*2, L, R, k);elsereturn Query1(m+1, r, x*2+1, L, R, k-sum);
}
int main(void)
{uint m, opt, L, R, k;scanf("%d%d", &n, &m);n += 1;while(m--){scanf("%d%d%d%d", &opt, &L, &R, &k);if(opt==1){k = n-k;Update1(1, n, 1, L, R, k);}elseprintf("%d\n", n-Query1(1, n, 1, L, R, k));}return 0;
}

bzoj 3110: [Zjoi2013]K大数查询(树套树)相关推荐

  1. bzoj:3110: [Zjoi2013]K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  2. [bzoj 3110] [ZJOI2013] K大数查询

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3110 题目: 有N个位置,M个操作.操作有两种,每次操作如果是: 1 a b c:表示 ...

  3. 3110: [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...

  4. bzoj3110 [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 10703  Solved: 3209 [Submit][ ...

  5. [BZOJ3110] [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 9208  Solved: 2737 [Submit][S ...

  6. BZOJ3110: [Zjoi2013]K大数查询

    BZOJ3110: [Zjoi2013]K大数查询 Description 有N个位置,M个操作. 操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如 ...

  7. 洛谷 P3332 [ZJOI2013]K大数查询 解题报告

    P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...

  8. P3332 [ZJOI2013]K大数查询(整体二分做法)

    P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 [模板]可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改 ...

  9. P3332 [ZJOI2013]K大数查询【整体二分】或【树套树】

    传送门 给定一个长度为NNN的可重集合 支持修改,离线 求区间可重集合的并集第K大 这里介绍两种方法[树套树]和 [整体二分] 这里还有个单点修改,有点类似的 P2617 Dynamic Rankin ...

最新文章

  1. postgres xshell copy 命令 内存溢出_良心国产工具,比Xshell好用还免费!
  2. 逆向学习-IDApython(一)
  3. 【Linux】线程同步之信号量同步
  4. Fastlane为iOS带来持续部署
  5. SAP License:什么是ERP、SAP?
  6. [bzoj1497][NOI2006]最大获利_网络流_最小割
  7. weblogic 修改控制台console访问路径 url
  8. javaSocket编程TCP
  9. win7右键计算机死机,Win7桌面点击右键死机的解决方法
  10. java单词大全_编程常用英语单词大全
  11. 2021 BNU Winter Training 9 (2020CCPC东北四省赛)
  12. mysql datesub interval_Mysql之INTERVAL与DATE_SUB与EXTRACT函数的使用
  13. 2022骨传导蓝牙耳机哪个最专业、目前最好的骨传导耳机
  14. BootStrap一页通(样式+组件+插件)
  15. 树莓派4B-安装64位操作系统
  16. 解决xp共享的批处理文件
  17. 轻量应用服务器 饥荒,饥荒服务端世界设置生成
  18. 2019版云计算大数据学习路线图(含大纲+视频+工具+书籍+面试)
  19. RK3588 AP6398RS3之WIFI调试(一)
  20. 【2309. 兼具大小写的最好英文字母】

热门文章

  1. python自学网站-分享干货:三个新手自学Python的网站!
  2. python编程案例教程-Python程序开发案例教程
  3. python是什么类型的语言-为什么说 Python 是强类型语言?
  4. ibm中文语音识别输入系统
  5. VB589语音识别芯片开发
  6. 你怎么看当前中文语音识别技术在国内的应用?
  7. tomact配置好ssl证书后访问不到tomact_服务器上配置HTTPS的操作方法!
  8. MongoDB查询文档(非常详细,不要错过哦~)
  9. HLS playlist典型示例
  10. C语言的面向对象设计 —— 对 X264/FFMPEG 架构探讨