差距 (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...