传送门

一开始想的是区间线段树套权值线段树,结果好像不能实现。

然后题解是权值线段树套区间线段树。

区间线段树上标记永久化就省去了pushdown的操作减少常数。

标记永久化的话。。yy不出来就看代码吧。

然后注意开long long

#include <cstdio>
#include <iostream>
#include <algorithm>
#define N 50010
#define LL long long using namespace std; int n, m, t, cnt;
LL sum[N * 200];
int opt[N], a[N], b[N], c[N], g[N], add[N * 200], ls[N * 200], rs[N * 200], root[N << 2]; inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} inline void insert2(int &now, int l, int r, int x, int y)
{
if(!now) now = ++cnt;
if(x <= l && r <= y)
{
add[now]++;
sum[now] += r - l + 1;
return;
}
int mid = (l + r) >> 1;
if(x <= mid) insert2(ls[now], l, mid, x, y);
if(mid < y) insert2(rs[now], mid + 1, r, x, y);
sum[now] = sum[ls[now]] + sum[rs[now]] + (LL)(r - l + 1) * add[now];
} inline void insert1(int now, int l, int r, int d, int x, int y)
{
insert2(root[now], 1, n, x, y);
if(l == r) return;
int mid = (l + r) >> 1;
if(d <= mid) insert1(now << 1, l, mid, d, x, y);
else insert1(now << 1 | 1, mid + 1, r, d, x, y);
} inline LL query2(int now, int l, int r, int x, int y)
{
if(x <= l && r <= y) return sum[now];
LL tmp = 0;
int mid = (l + r) >> 1;
if(x <= mid) tmp += query2(ls[now], l, mid, x, y);
if(mid < y) tmp += query2(rs[now], mid + 1, r, x, y);
return tmp + (LL)(min(r, y) - max(l, x) + 1) * add[now];
} inline int query1(int now, int l, int r, LL d, int x, int y)
{
if(l == r) return l;
int mid = (l + r) >> 1;
LL tmp = query2(root[now << 1 | 1], 1, n, x, y);
if(tmp < d) return query1(now << 1, l, mid, d - tmp, x, y);
else return query1(now << 1 | 1, mid + 1, r, d, x, y);
} int main()
{
int i;
n = read();
m = read();
for(i = 1; i <= m; i++)
{
opt[i] = read();
a[i] = read(), b[i] = read(), c[i] = read();
if(opt[i] == 1) g[++t] = c[i];
}
sort(g + 1, g + t + 1);
t = unique(g + 1, g + t + 1) - g - 1;
for(i = 1; i <= m; i++)
if(opt[i] == 1)
{
c[i] = lower_bound(g + 1, g + t + 1, c[i]) - g;
insert1(1, 1, t, c[i], a[i], b[i]);
}
else printf("%d\n", g[query1(1, 1, t, c[i], a[i], b[i])]);
return 0;
}

  

[luoguP3332] [ZJOI2013]K大数查询(树套树)的更多相关文章

  1. P3332 [ZJOI2013]K大数查询(线段树套线段树+标记永久化)

    P3332 [ZJOI2013]K大数查询 权值线段树套区间线段树 把插入的值离散化一下开个线段树 蓝后每个节点开个线段树,维护一下每个数出现的区间和次数 为了防止MLE动态开点就好辣 重点是标记永久 ...

  2. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

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

  3. BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)

    题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...

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

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

  5. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  6. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  7. Cogs 1345. [ZJOI2013] K大数查询(树套树)

    [ZJOI2013] K大数查询 /* 树套树写法. bzoj过不了. 可能有负数要离散吧. 线段树套线段树. 外层权值线段树,内层区间线段树维护标记. 对权值建一棵权值线段树. 某个点表示权值在某个 ...

  8. BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )

    BIT+(可持久化)权值线段树, 用到了BIT的差分技巧. 时间复杂度O(Nlog^2(N)) ---------------------------------------------------- ...

  9. BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)

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

随机推荐

  1. Mybatis-延迟加载和缓存

    延迟加载 概念: 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据.延迟加载也称懒加载. 好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表 ...

  2. python_74_pickle反序列化

    import pickle def say(name):#序列化时用完会释放,要想反序列化,要重新写上该函数,否则会出错 print('我的高中', name)#可以和之前的序列化函数不同 f=ope ...

  3. solr数据分片相关

    solr操作url 使用正常的core,使用命令生成coillection solr create_collection -c students2 -d ../server/solr/my/conf ...

  4. java编程基础——栈压入和弹出序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  5. Smallest Common Multiple-freecodecamp算法题目

    Smallest Common Multiple 1.要求 找出能被两个给定参数和它们之间的连续数字整除的最小公倍数. 2.思路 设定一个twoMultiple(a,b)函数,求出输入两个参数的最小公 ...

  6. https://www.atlassian.com

    https://www.atlassian.com 解决:confluence 5.9.4 一次性恢复30个插件 - 简书 https://www.jianshu.com/p/c32d8aa739b8 ...

  7. Tesseract-ocr视觉学习-验证码识别及python import pytesseract使用

    Tesseract-OCR的简单使用与训练 最近看到某个网站提交数据要提交验证码,用tesseract自带的识别, 识别出来是什么鬼,0-9识别成了什么玩意! so决定自己训练下tesseract.. ...

  8. Vue之简易的留言板功能

    今天我将带大家通过Vue的todolist案例来完成一个简易的网页留言板! LES'T GO! 首先我们需要在页面上搭建一个input文本输入框,并设置提交按钮,通过循环指令来完成输入框的信息提交! ...

  9. HashMap的实现原理和底层数据结构

    看了下Java里面有HashMap.Hashtable.HashSet三种hash集合的实现源码,这里总结下,理解错误的地方还望指正 HashMap和Hashtable的区别 HashSet和Hash ...

  10. java十分钟速懂知识点——引用

    一.由健忘症引起的问题 今天闲来没事在日志中瞟见了个OutOfMemoryError错误,不由得想到前一段时间看到一篇面经里问到Java中是否有内存泄露,这个很久以前是留意过的,大体记得内存溢出和内存 ...