暫時只做了遞增序列的求解方法,就是將原數列處理成個數的陣列,類似於字首和的東西,對這個頻率陣列求區間最大值,
但是僅僅維護區間max還是不夠的,,好比這種情況:
原數列: 1 1 1 2 3 5 5 7 7
頻率陣列: 1 2 3 1 1 1 2 1 2
下標: 1 2 3 4 5 6 7 8 9
如果查詢區間3~5,頻率陣列分別為3 1 1這樣,max就是3明顯不對,這時加一種處理,去掉開始的重複部分,就是保證查詢區間的第乙個數的頻率陣列權值為1。詳情見**:
ac**:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma comment(linker, "/stack:1024000000,1024000000")
using namespace std;
//#define maxd 1010
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define mc(x, y) memcpy(x, y, sizeof(x))
#define ms(x,y) memset(x,y,sizeof(x))
#define rep(i,n) for(int i=0;i<(n);i++)
#define repf(i,a,b) for(int i=(a);i<=(b);i++)
#define fi first
#define se second
#define it iterator
#define pb push_back
#define times 10
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pairpce;
//#define n 100
const double eps = 1e-10;
const double pi = acos(-1.0);
const ll mod = 1e9+7;
const int inf = 0x3f3f3f3f;
//const ll inf = (ll)1e18+300;
const int maxd = 100500 + 10;
int n;
int q;
int ac[maxd];
int max_[maxd][20];
int min_[maxd][20];
int pre[maxd];
void rmq()
for (int j = 1; j <= 20; j++) }}
}int main()
//sort(ac+1, ac+1+n);
for (int i = 1; i <= n; i ++)
if(ac[i] == ac[i - 1])
else
}rmq();
for (int i = 1; i <= q; i++)
int res = temp - a;
a = temp;
if(a <= b)
else }}
}
RMQ求區間最值
rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o n log n 查詢o 1 所以是乙個很快速的演算法,當然這個問題用線段樹同樣能夠解決。問題 給出n個數ai,讓你快速查詢某個區間的的最值。一 首先是預處理,用動態規劃 dp 解決。設a i 是要求區間最值的數列,f i,j 表示從...
RMQ 求區間最值
rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o n log n 查詢o 1 概念 rmq range minimum maximum query 即區間最值查詢,是指這樣乙個問題 對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中下標在i,j之間的最小...
模板 RMQ求區間最值
rmq簡單來說就是求區間的最大值 最小值 核心演算法 動態規劃 rmq 以下以求最大值為例 f i,j 表示 從 i 開始 到i 2j 1這個區間中的最大值 狀態轉移方程 f i,j max f i,j 1 f i 2 j 1,j 1 我們可以把區間 i,i 2j 1 平均分為兩個區間,因為j 1的...