题目描述:
数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数。
要求:
0 ≤ n, m ≤ 5×10^5
对于每次查询的区间[a, b],都有a ≤ b
各点的坐标互异
输入格式:
第一行包括两个整数:点的总数n,查询的次数m。
第二行包含n个数,为各个点的坐标。
以下m行,各包含两个整数:查询区间的左、右边界a和b。
输出格式:
对每次查询,输出落在闭区间[a, b]内点的个数。
输入样例:
5 2
1 3 7 9 11
4 6
7 12
输出样例:
0
3
题解:
//本题的逻辑结构:栈
//本题的存储结构:顺序
//解题思路和算法:通过建立两个堆栈,每次比较将第一个堆栈的内容按顺序弹出并弹入
// 另一个堆栈,在弹出后判断是否处于区间,之后放入另一个堆栈暂存,
// 遍历完成后把数据从第二个堆栈放回第一个堆栈
//效率:时间复杂度 O(n)、空间复杂度 O(1):
//测试数据: (1)输入:5 2
// 1 3 7 9 11
// 4 6
// 7 12
// 输出:
// 0
// 3
#include<stdio.h>
#define TRUE 1
#define FALSE 0
#define ERROR -1
typedef int Position;
typedef int ElementType;
typedef struct SNode * PtrToSNode;
typedef int bool;
struct SNode
{
/* data */
ElementType *Data;
Position Top;
int MaxSize;
};
typedef int git ;
typedef PtrToSNode Stack;
Stack CreateStack(int MaxSize){
Stack S = (Stack)malloc(sizeof(struct SNode));
S->Data = (ElementType*)malloc(MaxSize * sizeof(ElementType));
S->Top = -1;
S->MaxSize = MaxSize;
return S;
}
bool IsFull(Stack S){
return (S->Top == S->MaxSize-1);
}
ElementType Push(Stack S, ElementType X){
if (IsFull(S)){
return FALSE;
}
else{
S->Data[++(S->Top)]=X;
return X;
}
}
bool IsEmpty(Stack S){
return(S->Top==-1);
}
ElementType Pop(Stack S){
if(IsEmpty(S)){
return ERROR;
}
else{
return (S->Data[(S->Top)--]);
}
}
int main(){
Stack S1 = CreateStack(500000);
Stack S2 = CreateStack(500000);
int Total;
scanf("%d", &Total); //1
int Frequency;
scanf("%d",&Frequency); //1
int res[Frequency];
for(int i=0;i<Total;i++){ //n
int num;
scanf("%d",&num);
Push(S1, num);
}
for(int j=0;j<Frequency;j++){
int minNum;
int maxNum;
int Target = 0;
scanf("%d",&minNum);
scanf("%d",&maxNum);
while(!IsEmpty(S1)){ //m
int popNum = Push(S2,Pop(S1));
if(minNum<popNum || minNum==popNum){
if(maxNum>popNum || maxNum==popNum){
Target++;
}
else{
continue;
}
}
else{
continue;
}
}
res[j]=Target;
while(!IsEmpty(S2)){ //n
Push(S1,Pop(S2));
}
Target = 0;
}
for(int i=0;i<Frequency;i++){ //n
printf("%d\n",res[i]);
}
return 0;
}