1. 程式人生 > 其它 >計算機網路第八版部分習題(謝希爾)

計算機網路第八版部分習題(謝希爾)

題面

老管家是一個聰明能幹的人。他為財主工作了整整 \(10\) 年。財主為了讓自已賬目更加清楚,要求管家每天記 \(k\) 次賬。由於管家聰明能幹,因而管家總是讓財主十分滿意。但是由於一些人的挑撥,財主還是對管家產生了懷疑。於是他決定用一種特別的方法來判斷管家的忠誠,他把每次的賬目按 \(1, 2, 3 \ldots\) 編號,然後不定時的問管家問題,問題是這樣的:在 \(a\)\(b\) 號賬中最少的一筆是多少?為了讓管家沒時間作假,他總是一次問多個問題。

輸入格式

輸入中第一行有兩個數 \(m, n\),表示有 \(m\) 筆賬 \(n\) 表示有 \(n\) 個問題。

第二行為 \(m\) 個數,分別是賬目的錢數。

後面 \(n\) 行分別是 \(n\) 個問題,每行有 \(2\) 個數字說明開始結束的賬目編號。

輸出格式

在一行中輸出每個問題的答案,以一個空格分割。

提示

對於 \(100\%\) 的資料,\(m \leq 10^5\)\(n \leq 10^5\)

思路

ST表模板題。只需要把 P3865 【模板】ST 表
改改就可以了。

程式碼

#include <cstdio>
#include <cmath>
using namespace std;

int STTable[1000005][25];

int min(int x, int y){
	if(x>y){
		return y;
	}
	else{
		return x;
	}
}

inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9') {
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
int query(int l,int r) {
	int k=log2(r-l+1);
	return min(STTable[l][k],STTable[r-(1<<k)+1][k]);
}

int main() {
	int N=read(),M=read();
	for(int i=1; i<=N; i++) {
		STTable[i][0] = read();
	}
	for(int j=1; j<=21; j++) {
		for(int i=1; i+(1<<j)-1<=N; i++) {
			STTable[i][j]=min(STTable[i][j-1],STTable[i+(1<<(j-1))][j-1]);
		}
	}
	for(int i=1; i<=M; i++) {
		int l=read(),r=read();
		printf("%d ",query(l,r));
	}
	return 0;
}