[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=3110

[算法]

整体二分 + 线段树

时间复杂度 : O(NlogN ^ 2)

[代码]

#include<bits/stdc++.h>
using namespace std;
#define MAXN 500010
typedef long long ll;
typedef long double ld; struct query
{
int type , a , b;
ll c;
int id;
} q[MAXN]; int n , m;
int ans[MAXN]; struct Segment_Tree
{
ll cnt[MAXN << ] , tag[MAXN << ];
Segment_Tree()
{
memset(cnt , , sizeof(cnt));
}
inline void pushdown(int index , int l , int r)
{
int mid = (l + r) >> ;
cnt[index << ] += (mid - l + ) * tag[index];
cnt[index << | ] += (r - mid) * tag[index];
tag[index << ] += tag[index];
tag[index << | ] += tag[index];
tag[index] = ;
}
inline void update(int index)
{
cnt[index] = cnt[index << ] + cnt[index << | ];
}
inline void modify(int now , int l , int r , int ql , int qr , int value)
{
if (l == ql && r == qr)
{
cnt[now] += 1ll * value * (qr - ql + );
tag[now] += 1ll * value;
return;
}
pushdown(now , l , r);
int mid = (l + r) >> ;
if (mid >= qr) modify(now << , l , mid , ql , qr , value);
else if (mid + <= ql) modify(now << | , mid + , r , ql , qr , value);
else
{
modify(now << , l , mid , ql , mid , value);
modify(now << | , mid + , r , mid + , qr , value);
}
update(now);
}
inline ll query(int now , int l , int r , int ql , int qr)
{
if (l == ql && r == qr)
return cnt[now];
pushdown(now , l , r);
int mid = (l + r) >> ;
if (mid >= qr) return query(now << , l , mid , ql , qr);
else if (mid + <= ql) return query(now << | , mid + , r , ql , qr);
else return query(now << , l , mid , ql , mid) + query(now << | , mid + , r , mid + , qr);
}
} SGT;
template <typename T> inline void chkmin(T &x , T y) { x = min(x , y); }
template <typename T> inline void chkmax(T &x , T y) { x = max(x , y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline void divide(int l , int r , int L , int R)
{
static query tl[MAXN] , tr[MAXN];
int mid = (l + r) >> ;
if (L > R) return;
if (l == r)
{
for (int i = L; i <= R; i++)
if (q[i].type == ) ans[q[i].id] = mid;
return;
} else
{
int pl = , pr = ;
for (int i = L; i <= R; i++)
{
if (q[i].type == )
{
if (q[i].c > mid)
{
tr[++pr] = q[i];
SGT.modify( , , n , q[i].a , q[i].b , );
} else tl[++pl] = q[i];
} else
{
if (SGT.query( , , n , q[i].a , q[i].b) >= q[i].c)
tr[++pr] = q[i];
else
{
q[i].c -= SGT.query( , , n , q[i].a , q[i].b);
tl[++pl] = q[i];
}
}
}
for (int i = L; i <= R; i++)
if (q[i].type == && q[i].c > mid) SGT.modify( , , n , q[i].a , q[i].b , -);
for (int i = L; i <= L + pl - ; i++) q[i] = tl[i - L + ];
for (int i = L + pl; i <= R; i++) q[i] = tr[i - L - pl + ];
divide(l , mid , L , L + pl - );
divide(mid + , r , L + pl , R);
}
} int main()
{ read(n); read(m);
vector< int > que;
for (int i = ; i <= m; i++)
{
read(q[i].type);
read(q[i].a);
read(q[i].b);
read(q[i].c);
q[i].id = i;
if (q[i].type == ) que.push_back(i);
}
divide(-n , n , , m);
for (unsigned i = ; i < que.size(); i++) printf("%d\n" , ans[que[i]]); return ;
}

[ZJOI 2013] K大数查询的更多相关文章

  1. [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)

    [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...

  2. 数据结构(树套树):ZJOI 2013 K大数查询

    有几个点卡常数…… 发现若第一维为位置,第二维为大小,那么修改时第一维修改区间,查询时第一维查询区间,必须挂标记.而这种情况下标记很抽象,而且Push_down不是O(1)的,并不可行. 那要怎么做呢 ...

  3. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

  4. [BZOJ 3110] [ZJOI 2013] K大数查询

    Description 有 \(N\) 个位置,\(M\) 个操作.操作有两种,每次操作如果是: 1 a b c:表示在第 \(a\) 个位置到第 \(b\) 个位置,每个位置加入一个数 \(c\): ...

  5. 解题:ZJOI 2013 K大数查询

    题面 树套树,权值线段树套序列线段树,每次在在权值线段树上的每棵子树上做区间加,查询的时候左右子树二分 本来想两个都动态开点的,这样能体现树套树在线的优越性.但是常数太大惹,所以外层直接固定建树了QA ...

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

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

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

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

  8. 区间K 大数查询

      算法训练 区间k大数查询   时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列 ...

  9. 蓝桥杯 算法训练 区间k大数查询(水题)

    算法训练 区间k大数查询 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. ...

随机推荐

  1. 您也使用托管C++吗? 【转】

    http://blog.csdn.net/Muf/article/details/656920 转向.NET后,手头上往往仍有旧的模块要重用.也许这些模块是Delphi写的,也许是C/C++写的,或者 ...

  2. 理解Neural Style

    paperA Neural Algorithm of Artistic Style 在艺术领域,尤其是绘画,艺术家们通过创造不同的内容与风格,并相互交融影响来创立独立的视觉体验.如果给定两张图像,现在 ...

  3. PS 基础知识 .pat文件如何使用

    我下了pat文件单打不开,也下了ps 匿名 回答:5 人气:7 解决时间:2009-05-25 12:48 满意答案 将你下载的pat文件放到下面文件夹内,(这是默认安装地址),重新打开Photosh ...

  4. run kubernetes

    use kubeadm in lab only,,, do not use it in production      install docker 1.12.6 -..   please noted ...

  5. Solaris Samba服务器与DNS服务

    用于文件传输的协议,类似于ftp,ssh,只是它比其他两个好用. Samba协议 NetBIOS :一种编程接口. SMB:server message block .主要作为Microsoft网络通 ...

  6. nodejs REPL(交互式解释器)

    Node.js REPL(交互式解释器) Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux ...

  7. 使用JDBC连接SQL Server

    源文:http://bbs.bc-cn.net/dispbbs.asp?boardid=12&id=140292 整理:秋忆 接触Java或者JSP,难免会使用到数据库SQL Server 2 ...

  8. mysql优化之索引建立的规则

    索引经常使用的数据结构为B+树.结构例如以下 如上图,是一颗b+树,关于b+树的定义能够參见B+树,这里仅仅说一些重点.浅蓝色的块我们称之为一个磁盘块,能够看到每一个磁盘块包括几个数据项(深蓝色所看到 ...

  9. Centos7-安装Weblogic并配置 domain

    1.创建用户组 [root@localhost weblogic]# groupadd weblogic 2.创建 tmn 用户 [root@localhost weblogic]# useradd ...

  10. speechSynthesis,TTS语音合成。

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...