計算機網路第八版部分習題(謝希爾)
阿新 • • 發佈:2022-03-24
題面
老管家是一個聰明能幹的人。他為財主工作了整整 \(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; }