差距(模板題)

2021-08-05 22:32:21 字數 1996 閱讀 7290

差距 (difi)

【題目描述】

給定乙個 n 個數的數列,再給出 q 個詢問 a b,詢問 a 到 b 之間最大值和最

小值的差。

【輸入檔案】

第一行兩個整數 n,q。

接下來一行 n 個整數表示 ai。

接下來 q 行,表示乙個詢問 a b。

【輸出檔案】

q 行,每行對應乙個詢問的答案。

【樣例輸入】

5 4

7 2 4 3 8

2 4

2 5

1 3

3 5

【樣例輸出】

2 6 5 5

【資料規模】

對於 100%的資料 n<=200000, q<=100000

這道題就是一道模板題,介紹兩種打法

(1):線段樹

裸的線段樹區間查詢,這裡要開兩個線段樹,乙個記錄較大的節點,乙個記錄較小的節點。(只要改動up即可,較大的節點就在up時取max)。

#include

#define maxn 100007

using namespace std;

int i,j,k,n,m,q,tot,lf,rf,mid;

int f[maxn],add[maxn<<2],sum[maxn<<2],sum1[maxn<<2];

int minn(int a,int b)

void up(int node)

void up1(int node)

void build(int node,int l,int r)

int mid=(l+r)>>1;

build(node<<1,l,mid);

build((node<<1)+1,mid+1,r);

up(node);up1(node);

}long

long query(int l,int r,int le,int ri,int node)

long

long ans=2147483647;

int mid=(l+r)>>1;

if(le<=mid) ans=minn(query(l,mid,le,ri,node<<1),ans);

if(ri>=mid+1) ans=minn(ans,query(mid+1,r,le,ri,(node<<1)+1));

return ans;

}long

long query1(int l,int r,int le,int ri,int node)

long

long ans=-2147483647;

int mid=(l+r)>>1;

if(le<=mid) ans=maxx(query1(l,mid,le,ri,node<<1),ans);

if(ri>=mid+1) ans=maxx(ans,query1(mid+1,r,le,ri,(node<<1)+1));

return ans;

}int read()

int main()

return

0;}

(2)rmq

rmq更不用說了,直接暴力查詢區間最大值,最小值

#include

#include

using namespace std;

int i,j,k,n,m,tot,ans,q;

int d[100005][20],f[100005],p[100005][20];

intread()

int maxx(int a,int b)

int minn(int a,int b)

long long query(int l,int r)

void rmq1(int n)

long long query1(int l,int r)

int main()

return

0;}

分塊模板 模板題

嗯 直接貼板子了,注釋寫了點 include using namespace std const int maxn 1e5 10 int a maxn belong maxn l 1010 r 1010 block,num a陣列訪問原始資料,belong陣列表示每個數屬於哪一塊方便呼叫,l和r表示...

莫隊模板 模板題

也不說了直接上板子 include using namespace std struct quesq 200010 結構體存每個詢問,注意要記錄詢問順序以便輸出 const int block 1300 分的塊大小 int a 30010 ans 200010 res 0 a陣列資料,ans存各個詢...

分塊模板題

題目描述 給出乙個長為n的數列,以及n個操作,操作涉及區間加法,單點查值。輸入格式 第一行輸入乙個數字 n 第二行輸入 n 個數字,第 i 個數字為a i 以空格隔開 接下來輸入 n 行詢問,每行輸入四個數字 opt,l,r,c,以空格隔開 若 opt 0,表示將 l,r 的之間的數都加 c 若 o...