第K个数
Description
给你一个整数序列和若干个问题,问题是这个序列的第i个元素到第j个元素的片断中的第k大数是什么?比如说给你的序列为(1, 5, 2, 6, 3, 7, 4),问题是(2,5,3),则从第2个元素到第5个元素为(5,2,6,3),排序以后是(2,3,5,6),则第三个数是5。
输入:
第一行为两个整数n,m(1 <= n <= 100 000, 1 <= m <= 5 000),表示序列的元素个数和问题的个数,第二行为n个正整数的序列,每个整数为一个32位整数,两个数之间有一个空格隔开。以后m行为问题,每个问题由三个整数表示i,j,k,第i个元素到第j个元素的片断中的第k大数是什么?(元素序号从1开始计数,i<=j,1<=k<=j-i+1)
输出:
每行输出对应问题的结果。
Sample Input
7 3
1 5 2 6 3 7 4
2 5 3
4 4 1
1 7 3
Sample Output
5
6
3
#include<iostream>
using namespace std;
typedef struct nodes
{
int value;
int num;
};
nodes node[1000];
void quick_sort(int low,int high)
{
int i,j;
nodes key;
if(low<high)
{
i=low;
j=high;
key=node[low];
while(i<j)
{
while(i<j&&key.value<=node[j].value) j--;
node[i]=node[j];
while(i<j&&key.value>=node[i].value) i++;
node[j]=node[i];
}
node[i]=key;
quick_sort(low,i-1);
quick_sort(i+1,high);
}
}
int main()
{
int n;
cin>>n;
int cases;
cin>>cases;
int i=0;
for(i=0;i<n;i++)
{
cin>>node[i].value;
node[i].num=i+1;
}
quick_sort(0,n-1);
while(cases--)
{
int a,b,c,sum=0;
cin>>a>>b>>c;
for(i=0;i<n;i++)
{
if(a<=node[i].num&&node[i].num<=b)
{
sum++;
if(sum==c)
{
cout<<node[i].value<<endl;
break;
}
}
}
}
return 0;
}
分享到:
相关推荐
### ACM 最快的平方数之和 #### 题目背景与目标 在计算机科学与数学竞赛领域,ACM(Association for Computing Machinery)比赛经常涉及各种算法问题。本题目聚焦于一个具体的数学问题:如何快速地计算出一个给定...
本文将详细介绍一个基于C++语言实现的A*算法求解K短路径问题的模板代码,并对该模板中的关键部分进行深入解析。该算法适用于寻找两点之间前K条最短路径的问题,特别适用于ACM竞赛等场合。 #### 核心概念与原理 在...
- **随机素数测试(伪素数原理)**:使用概率方法测试一个数是否为素数。 - **组合数学相关**:涉及组合数学的基本概念和算法。 - **POLYA计数**:利用Polya定理进行计数问题。 - **组合数C(N,R)**:计算组合数C(n,r)...
- **第K短路(DIJKSTRA/A*)**:求解从起点到终点的第K条最短路径,可采用DIJKSTRA或A*算法实现。 - **PRIM求MST**:使用PRIM算法求解图的最小生成树(Minimum Spanning Tree, MST)。 - **次小生成树O(V^2)**:求解次...
- 使用概率方法测试一个数是否为素数。 - **组合数学相关** - 组合数学中的常见问题,如组合数的计算等。 - **POLYA计数** - POLYA计数定理用于计算在等价关系下可能的不同着色方案的数量。 - **组合数C(N,R)** ...
给出的C++代码示例中,定义了一个结构体`Stones`来存储石子堆,创建了一个链表队列`LinkStone`来管理这些石子堆,然后通过`InitStone`、`EnQueue`、`DeQueue`等函数来操作队列。`FetchStone`函数用于判断当前状态下...
- 使用随机测试来验证一个数是否为素数,这种方法基于伪素数原理。 - **组合数学相关** - 组合数学涉及排列、组合等内容,这部分内容涵盖了相关的公式和算法。 - **POLYA计数** - POLYA计数是一种解决具有对称...
每个PDF文件可能包含一道或多道题目,每道题都可能需要选手使用不同的编程语言(如C++、Java、Python等)和工具(如GCC、Visual Studio Code、Eclipse等)来完成。 具体到压缩包内的文件,我们可以假设这些PDF文档...
**树状数组**是一种设计巧妙的数据结构,它通过对原始数组进行特殊的构建,实现了高效的更新和查询操作。相比于普通数组,树状数组能够更快速地完成前缀和的查询和单点更新,具体而言: - **单点更新**: 在树状数组...
在C++中,可以定义一个函数`lcd(int u, int v, int h)`,其中`h`是两个数的最大公约数,`u`和`v`分别代表原始的两个数。 3. **扩展欧几里得算法(Extended Euclidean Algorithm)**: - 扩展欧几里得算法不仅计算...
它的主要目的是将数据集划分为K个不同的类别,使得每个类别内的数据点彼此相似,而类别之间的差异最大化。KM算法的基本步骤包括初始化质心、分配数据点到最近的质心所属的类别以及迭代更新质心,直到满足停止条件...
- 随机素数测试是一种快速判断一个数是否为素数的方法,利用了伪素数的概念。 11. **组合数学相关** - 组合数学研究的是组合结构的计数问题。 12. **POLYA计数** - POLYA计数是一种组合数学中的计数方法,...
- 这个问题通常可以通过快速选择算法或堆排序等方法来解决,寻找数组中第K小的元素。 14. KMP模式匹配算法: - KMP算法是一种字符串匹配算法,避免了对已经匹配的部分进行不必要的重新匹配,提高了效率。 15. ...
- 素数判定与生成:如使用筛法生成素数,或判断一个数是否为素数。 6. **图论**: - 最小生成树算法:Prim算法和Kruskal算法用于找到图中权重最小的边连接所有顶点。 - 单源最短路径:Dijkstra算法和Bellman-...
如果对于任意一个能被k整除的整数m,它的所有b-排列也都能够被k整除,则称该正整数k为b-稳定数(b-stable)。此题目的要求是找出所有给定基数b下的b-稳定数,并以标准十进制数的形式,按升序输出。 随后,“ACMICPC...
- 通过射线和边界的交点个数来判断。 **6. 判断点是否在线段上** - 判断点是否在线段的两个端点之间。 **7. 判断两线段是否相交** - 利用叉乘来判断线段的方向和位置关系。 **8. 判断线段与直线是否相交** - 判断...