[洛谷P3332][ZJOI2013]K大数查询
题目大意:有$n$个位置,$m$个操作。操作有两种:
- $1\;l\;r\;x:$在区间$[l,r]$每个位置加上一个数$x$
- $2\;l\;r\;k:$询问$[l,r]$中第$k$大的数是多少。
题解:树套树,权值线段树套位置线段树,要标记永久化,不然会$TLE$
卡点:没有标记永久化,$TLE$,然后处理$tag$部分写错
C++ Code:
#include <cstdio>
#include <algorithm>
#include <cctype>
namespace __IO {
namespace R {
int x, ch, f;
inline int readsign() {
f = 1;
while (isspace(ch = getchar()));
if (ch == '-') f = -1;
for (x = ch & 15; isdigit(ch = getchar()); ) x = x * 10 + (ch & 15);
return x * f;
}
inline int read() {
while (isspace(ch = getchar()));
for (x = ch & 15; isdigit(ch = getchar()); ) x = x * 10 + (ch & 15);
return x;
} long long X;
inline long long readll() {
while (isspace(ch = getchar()));
for (X = ch & 15; isdigit(ch = getchar()); ) X = X * 10 + (ch & 15);
return X;
}
}
}
using __IO::R::read;
using __IO::R::readsign;
using __IO::R::readll; #define maxn 50010 int n, m; namespace SgT2 {
#define N ((maxn << 3) * 50)
int lc[N], rc[N], tg[N], idx;
int L, R;
long long V[N]; void __insert(int &rt, const int l, const int r) {
if (!rt) rt = ++idx;
V[rt] += std::min(R, r) - std::max(L, l) + 1;
if (L <= l && R >= r) {
tg[rt]++;
return ;
}
int mid = l + r >> 1;
if (L <= mid) __insert(lc[rt], l, mid);
if (R > mid) __insert(rc[rt], mid + 1, r);
}
void insert(int &rt, int __L, int __R) {
L = __L, R = __R;
__insert(rt, 1, n);
} long long __query(const int rt, const int l, const int r) {
if (!rt || (L <= l && R >= r)) return V[rt];
int mid = l + r >> 1;
long long res = static_cast<long long> (std::min(R, r) - std::max(L, l) + 1) * tg[rt];
if (L <= mid) res += __query(lc[rt], l, mid);
if (R > mid) res += __query(rc[rt], mid + 1, r);
return res;
}
long long query(int rt, int __L, int __R) {
L = __L, R = __R;
return __query(rt, 1, n);
}
#undef N
} namespace SgT {
#define N (maxn << 3)
const int maxl = -50000, maxr = 50000;
int root[N];
int L, R, num;
void __insert(const int rt, const int l, const int r) {
SgT2::insert(root[rt], L, R);
if (l == r) return ;
int mid = l + r >> 1;
if (num <= mid) __insert(rt << 1, l, mid);
else __insert(rt << 1 | 1, mid + 1, r);
}
void insert(int __L, int __R, int __num) {
L = __L, R = __R, num = __num;
__insert(1, maxl, maxr);
} long long pos;
int __query(const int rt, const int l, const int r) {
if (l == r) return l;
int mid = l + r >> 1;
long long tmp = SgT2::query(root[rt << 1 | 1], L, R);
if (pos <= tmp) return __query(rt << 1 | 1, mid + 1, r);
else {
pos -= tmp;
return __query(rt << 1, l, mid);
}
}
int query(int __L, int __R, long long __pos) {
L = __L, R = __R, pos = __pos;
return __query(1, maxl, maxr);
}
#undef N
}
using SgT::insert;
using SgT::query; int main() {
n = read(), m = read();
while (m --> 0) {
int op = read(), l = read(), r = read();
if (op == 1) {
int c = readsign();
insert(l, r, c);
} else {
long long c = readll();
printf("%d\n", query(l, r, c));
}
}
return 0;
}
[洛谷P3332][ZJOI2013]K大数查询的更多相关文章
- 洛谷 P3332 [ZJOI2013]K大数查询 解题报告
P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...
- 洛谷 P3332 [ZJOI2013]K大数查询 (整体二分理解)
链接: P3332 题意: 维护 \(n(1\leq n\leq 5\times10^4)\) 个可重整数集,编号从 \(1\) 到 \(n\).有 \(m(1\leq m\leq5\times10^ ...
- 洛谷P3332 [ZJOI2013]K大数查询 权值线段树套区间线段树_标记永久化
Code: #include <cstdio> #include <algorithm> #include <string> #include <cstrin ...
- 洛谷 P3332 [ZJOI2013]K大数查询 || bzoj3110
用树套树就很麻烦,用整体二分就成了裸题.... 错误: 1.尝试线段树套平衡树,码农,而且n*log^3(n)慢慢卡反正我觉得卡不过去 2.线段树pushdown写错...加法tag对于区间和的更新应 ...
- P3332 [ZJOI2013]K大数查询(线段树套线段树+标记永久化)
P3332 [ZJOI2013]K大数查询 权值线段树套区间线段树 把插入的值离散化一下开个线段树 蓝后每个节点开个线段树,维护一下每个数出现的区间和次数 为了防止MLE动态开点就好辣 重点是标记永久 ...
- P3332 [ZJOI2013]K大数查询
传送门 注意操作 $1$ 是在区间的每个位置加入一个数,不是加上一个值 相当于每个位置维护的是一个集合 显然树套树 一开始想的是区间线段树套权值线段树 发现这样询问区间第 $K$ 大时就要先二分答案再 ...
- P3332 [ZJOI2013]K大数查询 整体二分
终于入门整体二分了,勉勉强强算是搞懂了一个题目吧. 整体二分很多时候可以比较好的离线处理区间\(K\)大值的相关问题.考虑算法流程: 操作队列\(arr\),其中有询问和修改两类操作. 每次在答案的可 ...
- 【BZOJ3110】【LG3332】[ZJOI2013]K大数查询
[BZOJ3110][LG3332][ZJOI2013]K大数查询 题面 洛谷 BZOJ 题解 和普通的整体分治差不多 用线段树维护一下每个查询区间内大于每次二分的值\(mid\)的值即可 然后再按套 ...
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
随机推荐
- Javascript闭包例子
闭包的概念 内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止.可理解为,闭包就是能够读取其他函数内部变量的函数. 表现形式是:定义在函数内部的函数. function f1() ...
- Redis系列二 Redis数据库介绍
1.SELECT命令 通过查看配置文件可以知道Redis默认有17个库,从0-16. 默认是在0号库.选择库使用SELECT <dbid>命令.例如选择0号库 SELECT 0 2.DB ...
- Awesome Flask
Awesome Flask A curated list of awesome Flask resources and plugins Awesome Flask Framework Admin i ...
- Matlab2018年最新视频教程视频讲义(包含代码)
2018年Matlab最新视频教程视频讲义(包含代码),适合初学者入门进阶学习,下载地址:百度网盘, https://pan.baidu.com/s/1w4h297ua6ctzfturQ1791g 内 ...
- hdu5305 Friends(dfs,多校题)
Friends Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- bash脚本练习
练习一: 1.添加5个用户,user1,...,user5: 2.每个用户的密码同用户名,添加密码完成后,不显示命令的执行结果: 3.每个用户添加完成后,都要显示用户某某已添加成功. useradd ...
- Java开发工程师(Web方向) - 01.Java Web开发入门 - 第5章.Git
第5章--Git 版本控制简介 VCS (version control system) 版本控制系统:记录若干文件的修订记录的系统,帮助查阅/回到某个历史版本 LVCS本地 CVCS集中式(Cent ...
- 【isJson( jsonObj )】判断是否是JSON实例
判断是否是JSON实例: 原型:isJson( jsonObj ) 说明:判断对象是否是JSON实例 返回:[true | false] 示例: <% Set jsonObj1 = toJson ...
- linux学习总结----redis总结
安装 下载:打开redis官方网站,推荐下载稳定版本(stable) 解压 tar zxvf redis-3.2.5.tar.gz 复制:推荐放到usr/local目录下 sudo mv -r ...
- Bootstrap栅格系统基本使用
1.什么是栅格系统: 在Bootstrap中,它提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列.栅格系统用于通过一系列的行(row ...