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. ios --- 调用系统"设置"里的功能(转)

    安装后第一次运行软件时,系统会弹出提示用户是否允许软件获取当前位置,如果用户不允许的话,之后运行时系统不会在弹出提示设置,这点很不方便,有个解决办法是给用户一个选项,调出iphone中“设置”定位服务 ...

  2. PNG24在ie6下的完美解决方法!(DD_belatedPNG)

    原网址:http://www.zjgsq.com/1629.html 之前写过一篇<js+css滤镜设置解决PNG24在IE6下显示问题> 解决方法不是很完美,使用起来也比较麻烦. DD_ ...

  3. CERC2016 爵士之旅 Jazz Journey

    传送门(洛谷) 题目大意 给定$n$个位置,和一个长为$m$的序列$A$,你需要经过一条直接的边从第$A_i$个位置到第$A_{i+1}$个位置. 每条有向边$(u,v)$分为两种,第一种可以花费$C ...

  4. LeetCode Employee Importance

    原题链接在这里:https://leetcode.com/problems/employee-importance/description/ 题目: You are given a data stru ...

  5. 快速沃尔什变换(FWT)学习笔记

    概述 FWT的大体思路就是把要求的 C(x)=A(x)×B(x)  即 \( c[i]=\sum\limits_{j?k=i} (a[j]*b[k]) \) 变换成这样的:\( c^{'}[i]=a^ ...

  6. @property_@synthesize 配套使用

    @property 类默认实现变量的get set方法 @synthesize 是指定那个变量的 get和set方法 eg: .h文件中定义 类Student中含有两个 int age,和int _a ...

  7. Contiki学习笔记

    http://blog.chinaunix.net/uid-9112803-id-2975824.html

  8. canvas路径绘制

    惯例,先贴代码: 1 /** 2 * Created by Administrator on 2016/1/27. 3 */ 4 function draw (id){ 5 var canvas = ...

  9. Oracle OCP提纲

    ocp提纲 Oracle SQL 基础 ◆ 标准SQL语言介绍◆ Oracle数据库数据组织形式◆ DDL语句创建表及修改表结构◆ Select语句检索和限制表中数据◆ 从多表中检索数据(连接查询)◆ ...

  10. a(+;-;*;/)b-----demo----bai

    页面: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8&qu ...