[题目链接]

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. 赞一下TMS Software 和 AdvStringGrid

    非常久前给Support发Email问能不能在设计期给AdvStringGrid标题加个数字标识.每次我都是自己改代码加上去.这次升级到新版本号,没想到增加了这个功能: 功能虽小可是非常有用,非常多的 ...

  2. [Django] 查看orm自己主动运行的原始查询sql

    django的文档看了非常多.也用了不少,有的时候感觉性能非常不好,知道非常多地方是惰性查询.可是对于复杂的逻辑.仅仅是表面上发现执行非常慢,机器资源消耗非常多.却不知道orm究竟是什么来转化成sql ...

  3. C++11 并发指南一(C++11 多线程初探)(转)

    引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...

  4. 前言(CSDN也有Markdown了,好开森)

    实战出精华 在具体的C++网络编程中提升你的逼格 John Torjo Boost.Asio C++ 网络编程 Copyright © 2013 Packt Publishing 关于作者 做为一名权 ...

  5. Android - Activity定制横屏(landscape)显示

    Activity定制横屏(landscape)显示 本文地址: http://blog.csdn.net/caroline_wendy Android横屏(landscape)显示:  android ...

  6. CentOS minimal 安装ssh 服务 和客户端

      检查是否装了SSH包 如果现实有openssh-server 说明系统已经安装了ssh 2 如果系统没有安装ssh 那么可以在线安装 yum install openssh-server 3 设置 ...

  7. gridcontrol复选框功能实现(超具体)

    博主这几天就准备离职了,以后不再做.Net开发.因此这应该是我写的最后一篇关于dev控件的博文.既然是最后一篇,那就写的具体一些.画个圆满的省略号...... 本文介绍gridcontrol怎样实现复 ...

  8. jquery+easyui主界面布局一例

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="workbench.aspx ...

  9. 关于erlang的向上取整和向下取整

    在erlang的API中,erlang:trunc/1 是就近取整,erlang:round/1是四舍五入的, 整理下:对于正数的向上和向下取整, %% 向上取整 ceil(N) -> T = ...

  10. 几个经典的TCP通信函数

    前言 在TCP通信中要使用到几个非常经典的函数( 点这里参考一个关于它们作用的形象比方 ),本文将对这几个函数进行一个简短的使用说明. socket函数 函数作用:创建一个网际字节流套接字 包含头文件 ...