Nhảy chuyển đến

Tăng gấp bội

Bổn giao diện đem giản yếu giới thiệu tăng gấp bội pháp.

Định nghĩa

Tăng gấp bội pháp ( tiếng Anh: binary lifting ), xem tên đoán nghĩa chính là phiên bội. Nó có thể sử tuyến tính xử lý chuyển hóa vì đối số cấp xử lý, rất lớn ưu hoá thời gian phức tạp độ.

Phương pháp này ở rất nhiều thuật toán trung đều có ứng dụng, trong đó nhất thường dùng chính là RMQ vấn đề cùng cầuLCA ( gần nhất công cộng tổ tiên ).

Ứng dụng

RMQ vấn đề

Tham kiến:RMQ chuyên đề

RMQ là Range Maximum/Minimum Query viết tắt, tỏ vẻ khu gian lớn nhất ( nhỏ nhất ) giá trị. Sử dụng tăng gấp bội tư tưởng giải quyết RMQ vấn đề phương pháp làST biểu.

Trên cây tăng gấp bội cầu LCA

Tham kiến:Gần nhất công cộng tổ tiên

Ví dụ mẫu

Đề 1

Ví dụ mẫu

Như thế nào dùng hết khả năng thiếu cân lượng ước lượng raChi gian sở hữu trọng lượng? ( chỉ có thể ở thiên bình một mặt phóng cân lượng )

Giải đề ý nghĩ

Đáp án là sử dụng 1 2 4 8 16 này năm cái cân lượng, có thể ước lượng raChi gian sở hữu trọng lượng. Đồng dạng, nếu muốn ước lượngChi gian sở hữu trọng lượng, có thể sử dụng 1 2 4 8 16 32 64 này bảy cái cân lượng. Mỗi lần chúng ta đều lựa chọn 2 chỉnh thứ mịch làm cân lượng trọng lượng, liền có thể sử dụng cực nhỏ cân lượng cái số lượng đảm nhiệm ý chúng ta sở yêu cầu trọng lượng.

Vì cái gì nói là cực nhỏ đâu? Bởi vì nếu chúng ta muốn lượng raChi gian sở hữu trọng lượng, chỉ cần 10 cái cân lượng, yêu cầu lượng raChi gian sở hữu trọng lượng, chỉ cần 20 cái. Nếu chúng ta mục tiêu trọng lượng phiên bội, cân lượng cái số chỉ cần gia tăng 1. Cái này kêu “Đối số cấp” tăng trưởng tốc độ, bởi vì cân lượng sở cần cái số cùng mục tiêu trọng lượng phạm vi đối số có quan hệ trực tiếp.

Đề 2

Ví dụ mẫu

Cấp ra một cái chiều dài vìHoàn cùng một cái hằng số,Mỗi lần sẽ từ đệCái điểm nhảy đến đệCái điểm, tổng cộng nhảyThứ. Mỗi cái điểm đều có một cái quyền giá trị, nhớ vì,CầuThứ nhảy lên khởi điểm quyền giá trị chi cùng đốiLấy mô kết quả.

Số liệu phạm vi:,,,.

Giải đề ý nghĩ

Nơi này hiển nhiên không thể bạo lực bắt chước nhảyThứ. Bởi vìLớn nhất nhưng đếnCấp bậc, nếu bạo lực bắt chước nói, thời gian không chịu nổi.

Cho nên liền yêu cầu tiến hành một ít dự xử lý, trước tiên chỉnh hợp nhất chút tin tức, để với ở tuần tra thời điểm càng mau đến ra kết quả. Nếu ký lục xuống dưới mỗi một cái khả năng nhảy lên số lần kết quả nói, bất luận là thời gian vẫn là không gian đều khó có thể thừa nhận.

Như vậy hẳn là như thế nào dự xử lý đâu? Nhìn xem đạo thứ nhất ví dụ mẫu. Có ý nghĩ sao?

Trở lại chủ đề. Chúng ta muốn dự xử lý một ít tin tức, sau đó dùng dự xử lý tin tức tận lực mau chỉnh hợp ra đáp án. Đồng thời dự xử lý tin tức cũng không thể quá nhiều. Cho nên có thể dự xử lý ra lấy 2 chỉnh thứ mịch vì đơn vị tin tức, nói như vậy ở dự xử lý thời điểm chỉ cần xử lý chút ít tin tức, ở chỉnh hợp thời điểm cũng không cần mất công.

Tại đây đề thượng, chính là chúng ta dự xử lý ra từ mỗi cái giờ bắt đầu nhảy 1, 2, 4, 8 từ từ bước lúc sau kết quả ( vị trí điểm cùng điểm quyền cùng ), sau đó nếu muốn nhảy 13 bước, chỉ cần nhảy 1+4+8 bước thì tốt rồi. Nói cách khác trước tiên ở lúc đầu điểm nhảy 1 bước, sau đó lại ở nhảy lúc sau chung điểm nhảy 4 bước, lại tiếp theo nhảy 8 bước, đồng thời thống kê một chút trước xử lý tốt điểm quyền cùng, liền có thể biết nhảy 13 bước điểm quyền cùng.

Đối với mỗi một cái giờ bắt đầuBước, ký lục một cáigo[i][x]Tỏ vẻ đệCái điểm nhảyBước lúc sau chung điểm, màsum[i][x]Tỏ vẻ đệCái điểm nhảyBước lúc sau có thể đạt được điểm quyền cùng. Dự xử lý thời điểm, khai hai trọng tuần hoàn, đối với nhảyBước tin tức, chúng ta có thể coi như là trước nhảyBước, lại nhảyBước, bởi vì hiển nhiên có.Tức chúng ta cósum[i][x] = sum[i-1][x]+sum[i-1][go[i-1][x]],Thảgo[i][x] = go[i-1][go[i-1][x]].

Đương nhiên còn có một ít thực hiện chi tiết yêu cầu chú ý. Vì bảo đảm thống kê thời điểm không nặng không lậu, chúng ta giống nhau dự xử lý ra “Tả bế hữu khai” điểm quyền cùng. Đó là, đối với nhảy 1 bước tình huống, chúng ta chỉ ký lục nên điểm điểm quyền cùng; đối với nhảy 2 bước tình huống, chúng ta chỉ ký lục nên điểm và tiếp theo cái điểm điểm quyền cùng. Tương đương với luôn là không đem chung điểm điểm quyền cùng đưa vào sum. Như vậy ở dự xử lý thời điểm, chỉ cần đem hai bộ phận điểm quyền cùng trực tiếp tương thêm là được, không cần lo lắng đoạn thứ nhất chung điểm cùng đệ nhị đoạn khởi điểm sẽ bị lặp lại tính toán.

Này đề,Tuy rằng nhìn như khủng bố, nhưng là trên thực tế chỉ cần dự xử lý raTrong vòng,Liền có thể nhẹ nhàng giải quyết, so với bạo lực cái cử nhanh rất nhiều. Dùng ngôn ngữ trong nghề giảng, cái này cách làmThời gian phức tạp độLà dự xử lý,Tuần tra mỗi lầ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
#include&LTcstdio>
usingnamespacestd;

constexprintmod=1000000007;

intmodadd(inta,intb){
if(a+b>=mod)returna+b-mod;// phép trừ thay thế lấy mô, nhanh hơn giải toán
returna+b;
}

intvi[1000005];

intgo[75][1000005];// đem số tổ hơi chút khai đại để tránh miễn vượt rào, tiểu nhân một duy tận lực định nghĩa ở phía trước
intsum[75][1000005];

intmain(){
intn,k;
scanf("%d%d",&n,&k);
for(inti=1;in;++i){
scanf("%d",vi+i);
}

for(inti=1;in;++i){
go[0][i]=(i+k)%n+1;
sum[0][i]=vi[i];
}

intlogn=31-__builtin_clz(n);// một cái mau lẹ lấy đối số phương pháp
for(inti=1;ilogn;++i){
for(intj=1;jn;++j){
go[i][j]=go[i-1][go[i-1][j]];
sum[i][j]=modadd(sum[i-1][j],sum[i-1][go[i-1][j]]);
}
}

longlongm;
scanf("%lld",&m);

intans=0;
intcurx=1;
for(inti=0;m;++i){
if(m&(1lli)){// tham kiến vị giải toán tương quan nội dung, ý vì m đệ i vị hay không vì 1
ans=modadd(ans,sum[i][curx]);
curx=go[i][curx];
m^=1lli;// đem đệ i vị trí linh
}
}

printf("%d\n",ans);
}