[洛谷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 ...
随机推荐
- kaggle入门--泰坦尼克号之灾(手把手教你)
作者:炼己者 具体操作请看这里-- https://www.jianshu.com/p/e79a8c41cb1a 大家也可以看PDF版,用jupyter notebook写的,视觉效果上感觉会更棒 链 ...
- 说一说VIN码识别,车架号识别那些事
对于有车一族的朋友来说,日常接触比较多的是车牌.行驶证.驾驶证,而知道VIN码/车架号码的比较少. 其实,对于车辆来说,VIN码/车架号码非常重要,它就像人的身份证一样,VIN码/车架号码是车辆唯一的 ...
- 怎样安装JMeter
JMeter有图形界面, 而且支持中文! JMeter官网地址: http://jmeter.apache.org/ 点击左上角的下载: 点击下面的.zip后缀的压缩包: 解压到本地: JMeter目 ...
- word record 01
词义默认包括发音 coil /kɔɪl/ 发音(kuo you) collage /kə'lɑʒ/ 发音(ke la shi) colleague /'kɑliɡ/ 发音 (ka li ge) com ...
- Struts2(九.初始化用户列表时显示用户照片数目)
1.userlist.jsp //显示每个用户照片的数目(遍历每个用户) $(".picture").each(function(i,e){ $.post("${page ...
- 在github上面创建属于自己的个性主页
圈子里面越来越多的同事在github上面创建自己的项目文档,那里确实高手云集,海内外的技术大牛小牛们都在那儿有一席之地,为“helloword”贡献自己. 以上感慨略过... 这几日正想创建一个自己的 ...
- LeetCode 700——二叉搜索树中的搜索
1. 题目 2. 解答 如果根节点为空,直接返回 NULL.如果根节点非空,从根节点开始循环查找,直到节点为空. 如果待查找的值大于当前节点值,节点指向右孩子: 如果待查找的值小于当前节点值,节点指向 ...
- 深入理解Java 8 Lambda(类库篇——Streams API,Collectors和并行)
转载:http://zh.lucida.me/blog/java-8-lambdas-inside-out-library-features/ 关于 深入理解 Java 8 Lambda(语言篇——l ...
- Mybatis generator自动生成mybatis配置和类信息
自动生成代码方式两种: 1.命令形式生成代码,详细讲解每一个配置参数. 2.Eclipse利用插件形式生成代码. 安装插件方式: eclipse插件安装地址:http://mybatis.google ...
- VBA基础之Excel 工作表(Sheet)的操作(二)
二. Excel 工作表(Sheet)的操作1. Excel 添加工作表(Sheet) 方法名 参数 参数值 说明 Add Before 工作表名称 在指定的工作表前面插入新的工作表 After 工作 ...