传送门

注意操作 $1$ 是在区间的每个位置加入一个数,不是加上一个值

相当于每个位置维护的是一个集合

显然树套树

一开始想的是区间线段树套权值线段树

发现这样询问区间第 $K$ 大时就要先二分答案再用 $O(log^2_n)$ 时间查询

那么单次询问的复杂度就有 $O(log^3_n)$ ,显然不行

考虑权值线段树套区间线段树

单次插入复杂度还是 $O(log^2_n)$,询问时只要在权值线段树上二分就行

那么单次操作复杂度就是 $O(log^2_n)$

据说此题很卡常,为了防止我的大常数导致 $GG$ 所以学了一下线段树的标记用久化

简单说就是标记不下传,只要询问时把经过节点的标记加进来一起计算贡献,代码不难想

因为空间问题所以内层的区间线段树要动态开点

因为插入的数可能为负,所以要离散化,注意 $long long$ !

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
inline ll readll()
{
ll x=; int f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e5+,M=2e7+;
int n,m,cnt,A[N],T;
int rt[N],L[M],R[M],tag[M];//区间线段树的数组,根节点,左儿子,右儿子,永久标记
ll sum[M];//区间线段树数组,区间和
int ql,qr; ll res;
void add(int &o,int l,int r)//区间加1
{
if(!o) o=++cnt;//动态开点
sum[o]+= max( min(r,qr)-max(l,ql)+ ,) ;//因为永久标记所以要这样更新sum
if(l>=ql&&r<=qr) { tag[o]++; return; }//注意我的tag是给儿子的,要先更新sum
int mid=l+r>>;
if(ql<=mid) add(L[o],l,mid);
if(qr>mid) add(R[o],mid+,r);
}
void query(int o,int l,int r,int tot)//区间求和,tot维护当前经过节点的tag的和
{
if(l>=ql&&r<=qr) { res+=sum[o]+1ll*(r-l+)*tot; return; }//更新res
int mid=l+r>>;
if(ql<=mid) query(L[o],l,mid,tot+tag[o]);
if(qr>mid) query(R[o],mid+,r,tot+tag[o]);
}
int POS,RES; ll K;
void ADD(int o,int l,int r)//权值线段树插入
{
add(rt[o],,n); if(l==r) return;
int mid=l+r>>;
if(POS<=mid) ADD(o<<,l,mid);
else ADD(o<<|,mid+,r);
}
void QUERY(int o,int l,int r)//权值线段树处理询问
{
if(l==r) { RES=A[l]; return; }
int mid=l+r>>;
res=; query(rt[o<<|],,n,);//注意优先走大的!
if(res<K) { K-=res; QUERY(o<<,l,mid); }
else QUERY(o<<|,mid+,r);
}
int op[N],dl[N],dr[N],dk[N];//读入的数据
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
n=read(),m=read();
for(int i=;i<=m;i++)
{
op[i]=read(),dl[i]=read(),dr[i]=read(),dk[i]=readll();
if(op[i]==) A[++T]=dk[i];
}
sort(A+,A+T+);
T=unique(A+,A+T+)-A-;//离散化
for(int i=;i<=m;i++)
if(op[i]==) dk[i]=lower_bound(A+,A+T+,dk[i])-A;
for(int i=;i<=m;i++)
{
ql=dl[i],qr=dr[i];
if(op[i]==) { POS=dk[i]; ADD(,,T); }
else
{
K=dk[i]; QUERY(,,T);
printf("%d\n",RES);
}
}
return ;
}

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

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

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

  2. 洛谷 P3332 [ZJOI2013]K大数查询 解题报告

    P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...

  3. 洛谷 P3332 [ZJOI2013]K大数查询 (整体二分理解)

    链接: P3332 题意: 维护 \(n(1\leq n\leq 5\times10^4)\) 个可重整数集,编号从 \(1\) 到 \(n\).有 \(m(1\leq m\leq5\times10^ ...

  4. P3332 [ZJOI2013]K大数查询 整体二分

    终于入门整体二分了,勉勉强强算是搞懂了一个题目吧. 整体二分很多时候可以比较好的离线处理区间\(K\)大值的相关问题.考虑算法流程: 操作队列\(arr\),其中有询问和修改两类操作. 每次在答案的可 ...

  5. [洛谷P3332][ZJOI2013]K大数查询

    题目大意:有$n$个位置,$m$个操作.操作有两种: $1\;l\;r\;x:$在区间$[l,r]$每个位置加上一个数$x$ $2\;l\;r\;k:$询问$[l,r]$中第$k$大的数是多少. 题解 ...

  6. 洛谷P3332 [ZJOI2013]K大数查询 权值线段树套区间线段树_标记永久化

    Code: #include <cstdio> #include <algorithm> #include <string> #include <cstrin ...

  7. 洛谷 P3332 [ZJOI2013]K大数查询 || bzoj3110

    用树套树就很麻烦,用整体二分就成了裸题.... 错误: 1.尝试线段树套平衡树,码农,而且n*log^3(n)慢慢卡反正我觉得卡不过去 2.线段树pushdown写错...加法tag对于区间和的更新应 ...

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

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

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

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

随机推荐

  1. c++ 多态问题(在虚函数里调用虚函数)

    最近在看cocos2d-x的源码,非常感激cocos2d作者的开源精神.在看代码的过程中感觉两个方向让我受益,1.把之前从书中看到的c++知识,明白了怎么运用.2.学习作者驾驭代码的巧妙方法. 看co ...

  2. 724. Find Pivot Index 找到中轴下标

    [抄题]: Given an array of integers nums, write a method that returns the "pivot" index of th ...

  3. 10.LIKE 操作符

    LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. LIKE 操作符 LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. SQL LIKE 操作符语法 SELECT colum ...

  4. LINUX 查看CUP温度

    在Linux下可以通过lm_sensors来查看CPU的温度(当然你的硬件首先要支持),要使用这个功能要有内核相关模块(比如I2C)的支持,下面说一下操作方法: 先看一下你的机器上是否安装了lm_se ...

  5. CodeBlocks调试功能(转)

    转自:迂者-贺利坚 http://blog.csdn.net/sxhelijian/article/details/15026159 示例代码: #include <iostream> u ...

  6. 黑盒测试实践--Day4 11.28

    黑盒测试实践--Day4 11.28 今天完成任务情况: 分块明确自己部分的工作,并做前期准备 完成被测系统--学生管理系统的需求规格说明书 完成Mook上高级测试课程的第六章在线学习,观看自动化测试 ...

  7. What’s the Difference Between a Value Provider and Model Binder?

    ASP.NET MVC 3 introduced the ability to bind an incoming JSON request to an action method parameter, ...

  8. BZOJ 4034[HAOI2015]树上操作(树链剖分)

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点 ...

  9. Oracle排序函數Rank

    出口給報關行出貨的時候,同一票shipment中合併多個invoice跟packing,轉出到廠商的報關系統時候,出口報關的序號會將invoice的序號做自動增加. 因為wafer會有出口給其他外包做 ...

  10. CentOS 网络操作

    ifconfig:查看网卡信息 网卡配置文件位置: /etc/sysconfig/network-scripts/文件夹 nmtui:配置网卡 netstat -tlunp:查看端口信息 端口信息存储 ...