Nhảy chuyển đến

RMQ

Tóm tắt

RMQ là tiếng Anh Range Maximum/Minimum Query viết tắt, tỏ vẻ khu gian lớn nhất ( nhỏ nhất ) giá trị.

Ở kế tiếp miêu tả trung, cam chịu mới bắt đầu số tổ lớn nhỏ vì,Dò hỏi số lần vì.

Ở kế tiếp miêu tả trung, cam chịu thời gian phức tạp độ đánh dấu phương thức vì,Trong đóTỏ vẻ dự xử lý thời gian phức tạp độ, màTỏ vẻ đơn thứ dò hỏi thời gian phức tạp độ.

Đơn điệu sạn

Bởi vìOI WikiTrung đã có này bộ phận miêu tả, bổn văn chỉ cấp raLiên tiếp.Này bộ phận không hề triển khai.

Thời gian phức tạp độ,Không gian phức tạp độ.

ST biểu

Bởi vìOI WikiTrung đã có này bộ phận miêu tả, bổn văn chỉ cấp raLiên tiếp.Này bộ phận không hề triển khai.

Thời gian phức tạp độ,Không gian phức tạp độ.

Đoạn thẳng thụ

Bởi vìOI WikiTrung đã có này bộ phận miêu tả, bổn văn chỉ cấp raLiên tiếp.Này bộ phận không hề triển khai.

Thời gian phức tạp độ,Không gian phức tạp độ.

Four Russian

Four russian là một cái từ bốn vị Nga tịch máy tính nhà khoa học nói ra căn cứ vào ST biểu thuật toán.

Ở ST biểu cơ sở thượng Four russian thuật toán đối này làm ra cải tiến là danh sách phân khối.

Cụ thể tới nói, chúng ta đem nguyên số tổ —— chúng ta đem này xưng là số tổ A—— mỗiCái phân thành một khối, tổng cộngKhối.

Đối với mỗi một khối chúng ta dự xử lý ra tới khối nội nguyên tố nhỏ nhất giá trị, thành lập một cái chiều dài vìSố tổ B, cũng đối số tổ B chọn dùng ST biểu phương thức dự xử lý.

Đồng thời, chúng ta đối với số tổ A mỗi một cái rải rác khối cũng thành lập một cái ST biểu.

Dò hỏi thời điểm, chúng ta có thể đem dò hỏi khu gian phân chia vì không vượt qua 1 cái số tổ B thượng liên tục khối khu gian cùng không vượt qua 2 cái số tổ A thượng chỉnh khối nội liên tục khu gian. Hiển nhiên mấy vấn đề này chúng ta thông qua ST biểu thượng khu gian tuần tra giải quyết.

Thời điểm, dự xử lý phức tạp độ đạt tới tối ưu, vì.

Thời gian phức tạp độ,Không gian phức tạp độ.

Đương nhiên dò hỏi bởi vì muốn chạy ba cái ST biểu, nên thực hiện phương pháp hằng số trọng đại.

Một ít nho nhỏ thuật toán cải tiến

Chúng ta phát hiện, ở dò hỏi hai cái điểm cuối ở số tổ A trung thuộc về bất đồng khối thời điểm, số tổ A trung khối nội dò hỏi là về mỗi một khối tiền tố hoặc là hậu tố dò hỏi.

Hiển nhiên này đó dò hỏi có thể thông qua dự xử lý đáp án ởThời gian phức tạp độ nội bị giải quyết.

Bộ dáng này chúng ta chỉ cần ở dò hỏi thời điểm tiến hành nhiều nhất một lần ST biểu thượng tuần tra thao tác.

Một ít huyền học thuật toán cải tiến

Bởi vì Four russian thuật toán lấy ST biểu làm cơ sở, mà thuật toán thi đua giống nhau không có phi thường cao thời gian phức tạp độ yêu cầu, cho nên Four russian thuật toán giống nhau đều có thể bị ST biểu thay thế, ở thuật toán thi đua trung cũng không thực dụng. Nơi này cung cấp một loại ở thuật toán thi đua trung càng thêm thực dụng Four russian cải tiến thuật toán.

Chúng ta đem khối lớn nhỏ thiết vì,Sau đó dự xử lý ra mỗi một khối nội tiền tố cùng hậu tố RMQ, lại bạo lực dự xử lý đảm nhiệm ý liên tục chỉnh khối chi gian RMQ, thời gian phức tạp độ vì.

Tuần tra khi, đối với tả hữu điểm cuối không ở cùng khối nội dò hỏi, chúng ta có thể trực tiếpĐược đến tả điểm cuối nơi khối hậu tố RMQ, tả điểm cuối cùng hữu điểm cuối chi gian liên tục chỉnh khối RMQ, cùng hữu điểm cuối nơi khối tiền tố RMQ, đáp án tức vì ba người chi gian nhất giá trị.

Mà đối với tả hữu điểm cuối ở cùng khối nội dò hỏi, chúng ta có thể bạo lực cầu ra hai điểm chi gian RMQ, thời gian phức tạp độ vì,Nhưng là đơn cái dò hỏi tả hữu điểm cuối ở cùng khối nội kỳ vọng vì,Cho nên loại này phương pháp thời gian phức tạp độ trong khi vọng.

Mà ở thuật toán thi đua trung, chúng ta cũng không dùng phi thường lo lắng ra đề mục người tạp rớt loại này thuật toán, bởi vì chúng ta có thể thông qua ởCơ sở thượng tùy cơ hơi điều khối lớn nhỏ, rất lớn trình độ thượng tránh cho thuật toán ở căn cứ riêng khối lớn nhỏ cấu tạo số liệu trung xuất hiện nhất hư tình huống. Hơn nữa nếu ra đề mục người muốn tạp rớt loại này phương pháp, tắc bạo lực có khả năng có thể thông qua.

Đây là một loại kỳ vọng thời gian phức tạp độ đạt tới hạ giới, hơn nữa số hiệu thực hiện khó khăn cùng thuật toán hằng số đều nhỏ lại thuật toán, bởi vậy ở thuật toán thi đua trung tương đối thực dụng.

Trở lên cách làm tham khảoP3793 từ nãi cứu gia giaTrung lời giải trong đề bài.

Thêm giảm 1RMQ

Nếu danh sách thỏa mãn liền nhau hai nguyên tố kém vì 1, ở cái này danh sách thượng làm RMQ có thể trở thành thêm giảm 1RMQ, tìm tòi cái này đặc tính có thể cải tiến Four Russian thuật toán, làm đượcThời gian phức tạp độ,Không gian phức tạp độ.

Bởi vì Four russian thuật toán bình cảnh ở chỗ khối nội RMQ vấn đề, chúng ta trọng điểm đi thảo luận khối nội RMQ vấn đề ưu hoá.

Bởi vì liền nhau hai cái con số kém giá trị vì,Cho nên ở cố định tả điểm cuối con số khi chiều dài không vượt quaPhía bên phải danh sách chủng loại số vì,Mà cái này tư thế hiển nhiên không vượt qua.

Này gợi ý chúng ta có thể dự xử lý sở hữu không vượt quaLoại tình huống nhỏ nhất giá trị - cái thứ nhất nguyên tố giá trị.

Ở dự xử lý thời điểm chúng ta yêu cầu đi dự xử lý cùng khối nội liền nhau hai cái con số chi gian kém, hơn nữa sử dụng cơ số hai đem này tỏ vẻ ra tới.

Ở dò hỏi thời điểm chúng ta tìm được dò hỏi khu gian đối ứng cơ số hai tỏ vẻ, tra biểu đến ra đáp án.

Bộ dáng này Four russian dự xử lý thời gian phức tạp độ đã bị ưu hoá tới rồi.

Descartes thụ ở RMQ thượng ứng dụng

Không hiểu biết Descartes thụ bằng hữu thỉnh dời bướcDescartes thụ.

Không khó phát hiện, nguyên danh sách thượng hai cái điểm chi gian min/max, tương đương Descartes trên cây hai cái điểm LCA quyền giá trị. Căn cứ điểm này liền có thể mượn dùngCầu giải trên cây hai cái điểm chi gian LCA tiến tới cầu giải RMQ.Trên cây LCA ởLCA - tiêu chuẩn RMQĐã có miêu tả, nơi này không hề triển khai.

Tổng kết một chút, Descartes thụ ở RMQ thượng ứng dụng, chính là thông qua đem bình thường RMQ vấn đề chuyển hóa vì LCA vấn đề, tiến tới chuyển hóa vì thêm giảm 1 RMQ vấn đề tiến hành cầu giải, thời gian phức tạp độ vì.Đương nhiên bởi vì chuyển hóa bước số so nhiều,RMQ hằng số trọng đại.

Nếu số liệu tùy cơ, còn có thể bạo lực ở Descartes trên cây tra tìm. Lúc này thời gian phức tạp độ trong khi vọng,Hơn nữa thực tế sử dụng khi loại này thuật toán hằng số thường thường rất nhỏ.

Ví dụ mẫuLuogu P3865【 khuôn mẫu 】ST biểu

Căn cứ vào trạng áp tuyến tính RMQ thuật toán

Ẩn tính yêu cầu

  • Danh sách chiều dàiThỏa mãn.

Trước trí tri thức

  • Sparse Table

  • Cơ bản vị giải toán

  • Trước sau chuế cực trị

Thuật toán nguyên lý

Đem nguyên danh sáchPhân thành mỗi khối chiều dài vìKhối.

Nghe nói lệnh khối trường vìThường xuyên số nhỏ lại.

Ký lục mỗi khối cực đại, cùng sử dụng ST biểu giữ gìn khối gian cực đại, phức tạp độ.

Ký lục khối trung mỗi cái vị trí trước, hậu tố cực đại(TứcĐến này nơi khối khối đầu cực đại ), phức tạp độ.

Nếu tuần traỞ hai cái bất đồng khối thượng, phân biệt nhớ vì đệKhối, tắc cực đại vìKhối gian cực đại, cùng vớiCùngNày ba cái số trọng đại giá trị.

Hiện tại vấn đề ở chỗ nếuỞ cùng khối trung làm sao bây giờ.

ĐemTheo thứ tự cắm vào đơn điệu sạn trung, ký lục hạ tiêu cùng giá trị, thỏa mãn giá trị từ sạn đế đến sạn đỉnh giảm dần, tắcTrung cực đại vì từ sạn đế hướng lên trên, đơn điệu sạn trung cái thứ nhất thỏa mãn này hạ tiêuGiá trị.

Bởi vìTrung cực đại, cho nên ở cắm vàoKhi,Đều bị bắn ra, thả ở cắm vàoKhi không có khả năng đemBắn ra.

Mà nếu dùngTỏ vẻ mỗi cái số hay không ở sạn trung, liền có thể dùng số nguyên trạng áp, tắcVì đệVị sau cái thứ nhấtVị trí.

Bởi vì khối lớn nhỏ vì,Cho nên nhiều nhất không vượt quaVị, có thể dùng một cái số nguyên tồn hạ ( tức ẩn tính điều kiện nguyên nhân ).

Tham khảo số hiệu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include&LTbits/stdc++.h>

constintMAXN=1e5+5;
constintMAXM=20;

structRMQ{
intN,A[MAXN];
intblockSize;
intS[MAXN][MAXM],Pow[MAXM],Log[MAXN];
intBelong[MAXN],Pos[MAXN];
intPre[MAXN],Sub[MAXN];
intF[MAXN];

voidbuildST(){
intcur=0,id=1;
Pos[0]=-1;
for(inti=1;iN;++i){
S[id][0]=std::max(S[id][0],A[i]);
Belong[i]=id;
if(Belong[i-1]!=Belong[i])
Pos[i]=0;
else
Pos[i]=Pos[i-1]+1;
if(++cur==blockSize){
cur=0;
++id;
}
}
if(N%blockSize==0)--id;
Pow[0]=1;
for(inti=1;iMAXM;++i)Pow[i]=Pow[i-1]*2;
for(inti=2;iid;++i)Log[i]=Log[i/2]+1;
for(inti=1;iLog[id];++i){
for(intj=1;j+Pow[i]-1id;++j){
S[j][i]=std::max(S[j][i-1],S[j+Pow[i-1]][i-1]);
}
}
}

voidbuildSubPre(){
for(inti=1;iN;++i){
if(Belong[i]!=Belong[i-1])
Pre[i]=A[i];
else
Pre[i]=std::max(Pre[i-1],A[i]);
}
for(inti=N;i>=1;--i){
if(Belong[i]!=Belong[i+1])
Sub[i]=A[i];
else
Sub[i]=std::max(Sub[i+1],A[i]);
}
}

voidbuildBlock(){
staticintS[MAXN],top;
for(inti=1;iN;++i){
if(Belong[i]!=Belong[i-1])
top=0;
else
F[i]=F[i-1];
while(top>0&&A[S[top]]A[i])F[i]&=~(1Pos[S[top--]]);
S[++top]=i;
F[i]|=(1Pos[i]);
}
}

voidinit(){
for(inti=1;iN;++i)scanf("%d",&A[i]);
blockSize=log2(N)*1.5;
buildST();
buildSubPre();
buildBlock();
}

intqueryMax(intl,intr){
intbl=Belong[l],br=Belong[r];
if(bl!=br){
intans1=0;
if(br-bl>1){
intp=Log[br-bl-1];
ans1=std::max(S[bl+1][p],S[br-Pow[p]][p]);
}
intans2=std::max(Sub[l],Pre[r]);
returnstd::max(ans1,ans2);
}else{
returnA[l+__builtin_ctz(F[r]>>Pos[l])];
}
}
}R;

intM;

intmain(){
scanf("%d%d",&R.N,&M);
R.init();
for(inti=0,l,r;iM;++i){
scanf("%d%d",&l,&r);
printf("%d\n",R.queryMax(l,r));
}
return0;
}

Bài tập

[BJOI 2020] phong ấn:SAM+RMQ