[NBUT 1458 Teemo]区间第k大问题,划分树

裸的区间第k大问题,划分树搞起。

 

#pragma comment(linker, "/STACK:10240000")
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;#define X                   first
#define Y                   second
#define pb                  push_back
#define mp                  make_pair
#define all(a)              (a).begin(), (a).end()
#define fillchar(a, x)      memset(a, x, sizeof(a))
#define fillarray(a, b)     memcpy(a, b, sizeof(a))typedef long long ll;
typedef pair<int, int> pii;
typedef unsigned long long ull;#ifndef ONLINE_JUDGE
void RI(vector<int>&a,int n){a.resize(n);for(int i=0;i<n;i++)scanf("%d",&a[i]);}
void RI(){}void RI(int&X){scanf("%d",&X);}template<typename...R>
void RI(int&f,R&...r){RI(f);RI(r...);}void RI(int*p,int*q){int d=p<q?1:-1;
while(p!=q){scanf("%d",p);p+=d;}}void print(){cout<<endl;}template<typename T>
void print(const T t){cout<<t<<endl;}template<typename F,typename...R>
void print(const F f,const R...r){cout<<f<<", ";print(r...);}template<typename T>
void print(T*p, T*q){int d=p<q?1:-1;while(p!=q){cout<<*p<<", ";p+=d;}cout<<endl;}
#endif
template<typename T>bool umax(T&a, const T&b){return b<=a?false:(a=b,true);}
template<typename T>bool umin(T&a, const T&b){return b>=a?false:(a=b,true);}const double PI = acos(-1.0);
const int INF = 1e9 + 7;
const double EPS = 1e-12;/* -------------------------------------------------------------------------------- */const int maxn = 1e5 + 7;/** 过程:快排的过程,通过记录进入左子区间的个数的前缀和来解决区间第k大问题 **/
class PartitionTree {int cnt[20][maxn], val[20][maxn], buf[maxn];int n;void init(int a[], int n) {this->n = n;fillchar(cnt, 0);fillchar(val, 0);fillarray(val[0], a);fillarray(buf, a);sort(buf, buf + n);}void build(int l, int r, int dep) {if (l == r) return ;int m = (l + r) >> 1, c = 0, small = 0;for (int i = l; i <= r; i ++) small += val[dep][i] < buf[m];for (int i = l; i <= r; i ++) {if (c < m - l + 1) {if (val[dep][i] < buf[m] || val[dep][i] == buf[m] && small < m - l + 1) {cnt[dep][i] = 1;val[dep + 1][l + c ++] = val[dep][i];small += val[dep][i] == buf[m];}}else break;}for (int i = l; i <= r; i ++) {if (!cnt[dep][i]) val[dep + 1][l + c ++] = val[dep][i];}build(l, m, dep + 1);build(m + 1, r, dep + 1);}/** 第k小 */int querykth(int L, int R, int k, int l, int r, int dep) {if (k <= 0 || k > R - L + 1) return - 1;if (L == R) return val[dep][L];int m = (l + r) >> 1, cl = cnt[dep][L - 1] - cnt[dep][l - 1], cr = cnt[dep][R] - cnt[dep][l - 1];if (cr - cl >= k) return querykth(l + cl, l + cr - 1, k, l, m, dep + 1);return querykth(m + 1 + L - l - cl, m + R - l + 1 - cr, k - cr + cl, m + 1, r, dep + 1);}
public:void build(int a[], int n) {init(a, n);build(1, n, 0);for (int i = 0; i < 20; i ++) {for (int j = 2; j <= n; j ++) {cnt[i][j] += cnt[i][j - 1];}}}int querykth(int L, int R, int k) { return querykth(L, R, k, 1, n, 0); }
};/** 下标从1开始 */PartitionTree pt;
int a[maxn];int main() {
#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout);
#endif // ONLINE_JUDGEint n, m;while (cin >> n >> m) {for (int i = 1; i <= n; i ++) {scanf("%d", a + i);}pt.build(a, n);int l, r, k;for (int i = 0; i < m; i ++) {scanf("%d%d%d", &l, &r, &k);printf("%d\n", pt.querykth(l, r, k));}}return 0;
}

转载于:https://www.cnblogs.com/jklongint/p/4749192.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux的软件包封装格式有,linux软件安装包详解---全

详细介绍了常见的四种Linux应用软件安装包及其安装方法。一、解析Linux应用软件安装包&#xff0c;通常Linux应用软件的安装包有四种&#xff1a;1) tar包&#xff0c;如software-1.2.3-1.tar.gz。他是使用UNIX系统的打包工具tar打包的。2) rpm包&#xff0c;如software-1.2.3-…

人生的第一个博客(●'◡'●)ノ♥--开博典礼

嘛&#xff0c;说实话&#xff0c;现在才开始&#xff0c;实在是有点晚了&#xff0c;一不小心大学都过去1年了_(:3 」∠)_ 我在专业方面的起步也是相当晚的&#xff0c;身为计算机专业&#xff0c;编程却从大学才开始正式接触&#xff0c;进入大学时其他方面的能力也都约等于0…

linux查看运行钟的tomcat,linux查看tomcat启动运行日志

Linux0&period;11内核--进程调度分析之2&period;调度[版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5596830.html ] 上一篇说到进程调度归根结底是调用timer_interrupt函数, ...iReport 下载地址iReport 下载地址: https://osdn.jp/projects/sfnet…

8月面试题目收录

面试题收录 常见兼容性问题&#xff1f; * png24位的图片在iE6浏览器上出现背景&#xff0c;解决方案是做成PNG8.* 浏览器默认的margin和padding不同。解决方案是加一个全局的*{margin:0;padding:0;}来统一。* IE6双边距bug:块属性标签float后&#xff0c;又有横行的margin情况…

linux如何升级php版本升级,Linux 升级php版本

近来因工作需要,又没有服务器维护人员,只能自己上阵啦。从php5.3.28->5.5.30,先自己下载php包到/usr/local/下​&#xff0c;# 解压缩安装包tar zxvf php-5.5.30.tar.gz# 进入目录cd php-5.5.30// 编译的时候一定要加入参数--enable-fpm#./configure --prefix/usr/local/php…

opencv配置

OpenCV的简单安装和一次性配置在这里就不赘述了&#xff0c;网上教程很多&#xff0c;可以参考一下这个链接里面的教程http://wenku.baidu.com/view/3b40de25453610661ed9f46b.html。 但是很多情况下面&#xff0c;我们新建一个项目就要重新配置一次OpenCV&#xff0c;那就相当…

linux ftp 工作过程,linux中ftp的安装过程记录[运维篇]

安装FTP的全过程记录&#xff0c;对于相同情况希望有所帮助。【centOS】1、查询本机是否安装vsftpd: rpm -qa |grep vsftpd &#xff1b;2、安装ftp服务 yum install vsftpd;3、开启ftp服务 chkconfig vsftpd on&#xff0c;开机启动&#xff1b;4、手动操作ftp服务&#xff0c…

代码命名,代码里的命名规则:错误的和正确的对比 命名方法总结 “自我描述的源代码”用代码表达出你的思想,让其他人通过代码能明白你的意图。...

http://www.aqee.net/express-names-in-code-bad-vs-clean/ 编程初学者总是把大量的时间用在学习编程语言&#xff0c;语法&#xff0c;技巧和编程工具的使用上。他们认为&#xff0c;如果掌握了这些技术技巧&#xff0c;他们就能成为不错的程序员。然而&#xff0c;计算机编程…

linux 动态执行cp,Linux常用命令之cp、mv、rm、cat、more、head、tail、ln命令讲解

上一章节中&#xff0c;我们了解到了Linux系统的最基础的几个文件处理命令&#xff0c;核心的是ls命令&#xff0c;在今天这章中&#xff0c;我们来继续学习Linux对于文件操作相关的一些命令&#xff0c;比如复制、移动、删除、查看等命令。1、cp 命令解释命令名称&#xff1a;…

使用DBI(perl)实现文本文件的导入导出mysql

DBI 是perl脚本连接数据库的一个模块。perl脚本相对shell更灵活&#xff0c;功能更强大&#xff0c;跨平台能力强。相对可执行jar包要简单很多。 ​1、下载安装包DBI-1.631.tar.gzperl脚本下载的网站http://www.cpan.org/ 很多perl的组件都可以在这个网站上下载 2、解压tar -xz…

linux 车载视频监控,基于Linux平台车载视频监控系统研发-计算机科学与技术专业论文.docx...

基于Linux平台车载视频监控系统研发-计算机科学与技术专业论文目录HYPERLINK \l "_bookmark0" 第一章 绪论1 HYPERLINK \l "_bookmark1" 1.1 研究背景1 HYPERLINK \l "_bookmark2" 1.2 研究动态1 HYPERLINK \l "_bookmark3" 1.3 本文工…

Linux鼠标回报率修改,鼠标回报率怎么调? 设置鼠标回报率的三种方法

鼠标回报率如何设置呢&#xff1f;鼠标回报率又称刷新率&#xff0c;是指鼠标MCU与电脑传输数据频率。鼠标回报率对于游戏玩家而言至关重要&#xff0c;但同时鼠标回报率与电脑性能息息相关。只有电脑硬件性能良好&#xff0c;才能适当提升鼠标回报率&#xff0c;以实现更高的鼠…

linux下vi修改文件用法

进入vi的命令 vi filename :打开或新建文件&#xff0c;并将光标置于第一行首 vi n filename &#xff1a;打开文件&#xff0c;并将光标置于第n行首 vi filename &#xff1a;打开文件&#xff0c;并将光标置于最后一行首 vi /pattern filename&#xff1a;打开文件&#xff…

linux在芯片设计与实现,基于Linux的Atheros无线芯片网卡驱动的设计与实现

Design and Implementation of Linux based Atheros wireless network cards driverDU Qingbo1杜清波(1985-)&#xff0c;男&#xff0c;硕士研究生&#xff0c;主要研究方向&#xff1a;嵌入式系统与网络通信1、School of Computer Science,Beijing University of Posts and T…

[转载]孙婧妍:高考语文148分是这样炼成的(附:孙婧妍

原文地址&#xff1a;孙婧妍&#xff1a;高考语文148分是这样炼成的(附&#xff1a;孙婧妍2013高考作文《手机论》)作者&#xff1a; 语文新高考高考语文148分是这样炼成的 (附&#xff1a;孙婧妍2013高考作文《手机论》) 来源&#xff1a;网络 作者&#xff1a;孙婧妍…

linux ps 命令安装,Linux上安装pstree命令(-bash: pstree: command not found)

一、pstree命令的安装1、在Mac OS上brew install pstree2、在Fedora/Red Hat/CentOSyum -y install psmisc3、在 Ubuntu/Debianapt-get install psmisc二、pstree命令详解pstree指令用ASCII字符显示树状结构&#xff0c;清楚地表达程序间的相互关系。如果不指定程序识别码或用户…

c语言字符串逆置,字符串逆置

满意答案9n7j5j3m4o2013.12.03采纳率&#xff1a;49% 等级&#xff1a;11已帮助&#xff1a;15198人47911 zxl0714 1358 Accepted 164K 15MS G 0.46K 2007-04-08 10:32:38#include using namespace std;void reverse(char* ch){int i, len;char tmp;len strlen( ch );for (…

哈夫曼编码c语言论文,哈夫曼编码的实现及应用论文.doc

哈夫曼编码的实现及应用论文毕 业 设 计(论文)题目 哈夫曼编码的实现及应用二级学院 数学与统计学院专 业 信息与计算科学班 级学生姓名 张泽欣 学号指导教师 职称时 间目录摘要IAbstractII第一章 绪论11.1 研究目的及意义11.2 图像压缩编码技术概述21.2.1 图像压缩编码技术分类…

css笔记3

CSS 多类选择器,通过把两个类选择器链接在一起&#xff0c;仅可以选择同时包含这些类名的元素&#xff08;类名的顺序不限&#xff09;。 <p class"important warning"> This paragraph is a very important warning. </p>.important {font-weight:bold;…

java保留有效数字

1 在处理数值运算的时候&#xff0c;有时候会遇到保留几位小数的需求&#xff0c;下面是一个保留两位小数的简单方法。2 /**3 * 将数据保留两位小数4 */5 privatedoublegetTwoDecimal(doublenum) {6 DecimalFormatdFormatnewDecimalFormat("#.00"…