BZOJ 3110

很早就想写的试炼场题。

不会整体二分啊呜呜呜,只能写写树套树。

有一个trick就是外层使用一个权值线段树,把位置作为下标的线段树放在内层,这样子的话我们在查询$k$大的时候就可以直接在外层线段树上一边走一边二分。

注意我们查询的是第$k$大不是第$k$小,所以我们在走的时候要观察右子树的权值和$k$的关系。

内层可以动态开点防mle,注意在打标记下传的时候要先给左右儿子赋值。

挺卡常的。

时间复杂度$O(nlog^2n)$。

Code:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll; const int N = 5e4 + ; int n, qn, mn, tot = ;
ll val[N]; struct Querys {
int type, l, r;
ll k;
} q[N]; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} namespace SegT {
struct Node {
int lc, rc, tag;
ll sum;
} s[N * ]; int root[N << ], nodeCnt = ; #define lc(p) s[p].lc
#define rc(p) s[p].rc
#define sum(p) s[p].sum
#define tag(p) s[p].tag
#define mid ((l + r) >> 1) inline void up(int p) {
if(!p) return;
sum(p) = sum(lc(p)) + sum(rc(p));
} inline void down(int p, int l, int r) {
if(!tag(p)) return;
if(!lc(p)) lc(p) = ++nodeCnt;
if(!rc(p)) rc(p) = ++nodeCnt;
sum(lc(p)) += 1LL * tag(p) * (mid - l + ), tag(lc(p)) += tag(p);
sum(rc(p)) += 1LL * tag(p) * (r - mid), tag(rc(p)) += tag(p);
tag(p) = ;
} void ins(int &p, int l, int r, int x, int y) {
if(!p) p = ++nodeCnt;
if(x <= l && y >= r) {
++tag(p);
sum(p) += 1LL * (r - l + );
return;
} down(p, l, r);
if(x <= mid) ins(lc(p), l, mid, x, y);
if(y > mid) ins(rc(p), mid + , r, x, y);
up(p);
} ll getSum(int p, int l, int r, int x, int y) {
if(!p) return 0LL;
if(x <= l && y >= r) return sum(p); down(p, l, r); ll res = 0LL;
if(x <= mid) res += getSum(lc(p), l, mid, x, y);
if(y > mid) res += getSum(rc(p), mid + , r, x, y);
return res;
} void modify(int p, int l, int r, int x, int y, int v) {
ins(root[p], , n, x, y);
if(l == r) return; if(v <= mid) modify(p << , l, mid, x, y, v);
else modify(p << | , mid + , r, x, y, v);
} int query(int p, int l, int r, int x, int y, ll k) {
if(l == r) return l; ll now = getSum(root[p << | ], , n, x, y);
if(now >= k) return query(p << | , mid + , r, x, y, k);
else return query(p << , l, mid, x, y, k - now);
} } using namespace SegT; int main() {
read(n), read(qn);
for(int i = ; i <= qn; i++) {
read(q[i].type), read(q[i].l), read(q[i].r), read(q[i].k);
if(q[i].type == ) val[++tot] = q[i].k;
} sort(val + , val + tot + );
tot = unique(val + , val + + tot) - val - ;
mn = tot; for(int i = ; i <= qn; i++) {
if(q[i].type == ) {
int v = lower_bound(val + , val + + tot, q[i].k) - val;
modify(, , mn, q[i].l, q[i].r, v);
} else printf("%lld\n", val[query(, , mn, q[i].l, q[i].r, q[i].k)]);
} return ;
}

Luogu 3332 [ZJOI2013]K大数查询的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

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

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

  8. 【BZOJ3110】【LG3332】[ZJOI2013]K大数查询

    [BZOJ3110][LG3332][ZJOI2013]K大数查询 题面 洛谷 BZOJ 题解 和普通的整体分治差不多 用线段树维护一下每个查询区间内大于每次二分的值\(mid\)的值即可 然后再按套 ...

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

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

随机推荐

  1. 1109. Group Photo (25)

    Formation is very important when taking a group photo. Given the rules of forming K rows with N peop ...

  2. Phone numbers

    Phone number in Berland is a sequence of n digits. Often, to make it easier to memorize the number, ...

  3. curl获取图片

    <?php set_time_limit(0); //执行30秒超时后继续执行 header("Content-type:text/html;charset=utf-8"); ...

  4. 超时 CS-8610 中性笔

    超时 CS-8610 中性笔 最初觉得这款笔很简单,而且还认为有点丑,因为笔头比较短. 比较特别提这款中性笔比一般的中性笔要粗一点. 使用后才发现比其它的中性笔好用,因为笔杆粗,手感好,笔杆上并没有特 ...

  5. CentOS7安装wget 及配置

    yum -y install wget yum -y install setup yum -y install perl

  6. Cortex-M0(+)内核的处理器架构简介

    Cortex-M0(+)内核的处理器架构简介 2015年03月02日 16:51:12 阅读数:3158 系统架构 Cortex-M0处理器具有32位系统总线接口,以及32位地址线,即有4GB的地址空 ...

  7. [转]ubuntu11.04配置nfs--解决mount.nfs: access denied问题

    总算通过了nfs的localhost测试. 配置很简单,下面摘自网络,并且整理下: 1 安装nfs #apt-get install nfs-kernel-server #apt-get instal ...

  8. 智能提示框---bai

    input.jsp <%@ page language="java" import="java.util.*" pageEncoding="UT ...

  9. c#在sql中存取图片image示例

    这篇文章主要介绍了c#在sql中存取图片image示例,需要的朋友可以参考下 (1)控制台应用程序下演示插入图片 复制代码 代码如下: public void InsertIMG() { //将需要存 ...

  10. CAD库中列举所有航路点

    select distinct f1.airway_point_name,f1.latitude,f1.longitude,upper(f1.airway_point_type_name)type,f ...