给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数。
给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数。
#include <iostream> using namespace std; #define SIZE 20 #define M 3 typedef struct Elem { int i, j; int k; } ELEM; /* 表示一个元素的三元组结构 */ int getMedian(int* arr, int low, int high) { int mid = low + ((high - low) >> 1); if (arr[mid] > arr[high]) { swap(arr[mid], arr[high]); } if (arr[low] > arr[high]) { swap(arr[low], arr[high]); } if (arr[mid] > arr[low]) { swap(arr[low], arr[mid]); } return arr[low]; } int findThMin(int* arr, int low, int high, int k) { int pivot = getMedian(arr, low, high); int lowTmp = low; int highTmp = high; while (lowTmp < highTmp) { while (lowTmp < highTmp && arr[highTmp] > pivot) { highTmp--; } arr[lowTmp] = arr[highTmp]; while (lowTmp < highTmp && arr[lowTmp] < pivot) { lowTmp++; } arr[highTmp] = arr[lowTmp]; } arr[lowTmp] = pivot; if (k == lowTmp) { return arr[lowTmp]; } else if (k < lowTmp) { return findThMin(arr, low, lowTmp - 1, k); } else { return findThMin(arr, lowTmp + 1, high, k); } } int* getSubArray(int* arr, int begin, int end) { int* tmp = new int[end - begin + 1]; for (int i = 0, j = begin; j <= end; ++i, j++) { tmp[i] = arr[j]; } return tmp; } int main() { Elem* elem = new Elem(); elem->i = 4; elem->j = 9; elem->k = 3; Elem* elem2 = new Elem(); elem2->i = 2; elem2->j = 8; elem2->k = 6; Elem* elem3 = new Elem(); elem3->i = 1; elem3->j = 6; elem3->k = 5; Elem *elems[M] = { elem, elem2, elem3 }; int* arr = new int[SIZE]; srand(unsigned(time(0))); for (int i = 0; i < SIZE; i++) { arr[i] = rand() * RAND_MAX + rand(); } for (int i = 0; i < M; ++i) { // cout << elems[i]->k << endl; //获取指定子数组 int* tmp = getSubArray(arr, elems[i]->i - 1, elems[i]->j - 1); /*cout << "before data set:" << endl; for (int k = 0; k <= elems[i]->j - elems[i]->i; ++k) { cout << tmp[k] << endl; }*/ //在规定的数组内取得第几个最小的元素 int data = findThMin(tmp, 0, elems[i]->j - elems[i]->i, elems[i]->k - 1); cout << elems[i]->k << " th min data:" << data << endl; cout << "after data set:" << endl; for (int k = 0; k <= elems[i]->j - elems[i]->i; ++k) { cout << tmp[k] << endl; } } return 0; }
给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数。的更多相关文章
- //给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和
//给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和 # include<stdio.h> void main() { ,sum1; ]={,- ...
- 如何生成a1,a2,a3,a4这样的变量名
var num=6; function Girl(beautifulScore){ this.beautifulScore=beautifulScore; } var girls=[]; for (v ...
- 给出一列数a1,a2,a3....an,求它们的逆序对数,即有多少个有序对(i,j) 使得iaj,n高达10的6次方
//归并排序 //#include<stdio.h> //#include<string.h> //#include<algorithm> //#include&l ...
- 已知一个序列A1.A2….An,给你一个整数K,找到满足所有Ai+Aj>=k的数对(i,j)的个数
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 100010 /* 已知一个序 ...
- Java笔试题:给定一个ReadOnlyClass的对象roc,能否把这个对象的age值改成30?
在Java笔试面试中,经常会遇到代码题,今天我们就来看一则Java代码笔试题. 有如下代码: Class ReadOnlyClass { private Integer age=20; public ...
- 寻找数列中第k大的数算法分析
问题描述:给定一系列数{a1,a2,...,an},这些数无序的,现在求第k大的数. 看到这个问题,首先想到的是先排序,然后直接输出第k大的数,于是得到啦基于排序的算法 算法一: #include&l ...
- 2018.3.12 Leecode习题 给定一个整数数列,找出其中和为特定值的那两个数。
给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 示例: 给定 nums = [2, 7, 11, 15], target = 9; 因为 ...
- Gym 101064 D Black Hills golden jewels 【二分套二分/给定一个序列,从序列中任意取两个数形成一个和,两个数不可相同,要求求出第k小的组合】
D. Black Hills golden jewels time limit per test 2 seconds memory limit per test 256 megabytes input ...
- E - 小晴天老师系列——我有一个数列!
E - 小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/O ...
随机推荐
- 直接插入排序算法:ArrayList实现和数组实现
直接插入排序算法思想: 排序区间R[1..n]: 在排序的过程中,整个排序区间被分为两个子区间: 有序区R[ 1 ... i-1 ]和无序区R[ i ... n ]: 共进行n-1趟排序,每趟排序都是 ...
- [Codeforces 863A]Quasi-palindrome
Description Let quasi-palindromic number be such number that adding some leading zeros (possible non ...
- bzoj 3191: [JLOI2013]卡牌游戏
Description N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X ...
- [BZOJ]4200: [Noi2015]小园丁与老司机
Time Limit: 20 Sec Memory Limit: 512 MBSec Special Judge Description 小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维 ...
- ●BZOJ 2839 集合计数
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2839 题解: 容斥原理 真的是神题!!! 定义 f[k] 表示交集大小至少为 k时的方案数怎 ...
- Linux input子系统 io控制字段【转】
转自:http://www.cnblogs.com/leaven/archive/2011/02/12/1952793.html http://blog.csdn.net/guoshaobei/arc ...
- Python Django的分页,Form验证,中间件
本节内容 Django的分页 Form 中间件 1 Django 分页 1.1 Django自带的分页 1.首先来看下我的测试数据环境 ############ models.py ######### ...
- 【实用】【移动端】Retain屏1px解决方案
新浪微博HTML5版 微博的实现方式(rem + 小数px) <meta name="viewport" content="width=device-width,i ...
- Go 实现判断变量是否为合法数字 IsNumeric 算法
[转] http://www.syyong.com/Go/Go-to-determine-whether-the-variable-is-a-legal-digital-algorithm.html ...
- 函数的属性和方法之call、apply 及bind
一.前言 ECMAScript中的函数是对象,因此函数也有属性和方法.每个函数都包含两个属性:length和prototype.每个函数也包含两个非继承来的方法:apply()和call(),还有一些 ...