Phân chia thụ là một loại tới giải quyết khu gian đệĐại một loại số liệu kết cấu, này hằng số, lý giải khó khăn đều phải so chủ tịch thụ thấp rất nhiều. Đồng thời, phân chia thụ kề sát “ĐệĐại”, cho nên là một loại căn cứ vào bài tự một loại số liệu kết cấu.
Kiến nghị trước học xongChủ tịch thụLại xem phân chia thụ nga
Quá trình
Thành tựu
Phân chia thụ thành tựu tương đối đơn giản, nhưng là tương đối với mặt khác thụ tới nói tương đối phức tạp.
Như đồ, mỗi một tầng đều có một cái nhìn như vô tự số tổ. Kỳ thật, mỗi một cái bị màu đỏ đánh dấu con số đều làMuốn phân phối đến tả nhi tử.Mà phân phối quy tắc là cái gì? Chính là cùngNày một tầng trung vị sốLàm tương đối, nếu nhỏ hơn hoặc bằng trung vị số, tắc phân đến bên trái, nếu không phân đến bên phải. Nhưng là nơi này phải chú ý một chút: Cũng không phải nghiêm khắcNhỏ hơn hoặc bằng liền phân đến bên trái, nếu không phân đến bên phải.Bởi vì trung vị số khả năng có tương đồng, hơn nữa cùngChẵn lẻ có nhất định quan hệ. Phía dưới số hiệu triển lãm sẽ có một cái xảo diệu vận dụng, đại gia có thể tham chiếu số hiệu.
Chúng ta không có khả năng mỗi một lần đều đối mỗi một tầng bài tự, bộ dáng này không nói hằng số, liền tính là lý luận phức tạp độ cũng không qua được. Chúng ta tưởng, tìm trung vị số, một lần bài tự là đủ rồi. Vì cái gì? Tỷ như, chúng ta cầuTrung vị số, kỳ thật chính là ở bài xong tự qua đinum[mid].
Hai cái mấu chốt số tổ:
tree[log(N),N]: Cũng chính là thụ, muốn tồn hạ sở hữu giá trị, không gian phức tạp độ.toleft[log(N),n]: Cũng chính là mỗi một tầng 1~i tiến vào tả nhi tử số lượng, nơi này yêu cầu lý giải một chút, đây là một cái tiền tố cùng.
procedureBuild(left,right,deep:longint);// left,right tỏ vẻ khu gian tả hữu điểm cuối,deep là đệ mấy tầngvari,mid,same,ls,rs,flag:longint;// trong đó flag là dùng để cân bằng hai bên trái phải số lượngbeginifleft=rightthenexit;// đến tầng dưới chótmid:=(left+right)>>1;same:=mid-left+1;fori:=lefttorightdoiftree[deep,i]num[mid]thendec(same);ls:=left;// phân phối đến tả nhi tử cái thứ nhất kim đồng hồrs:=mid+1;// phân phối đến hữu nhi tử cái thứ nhất kim đồng hồfori:=lefttorightdobeginflag:=0;if(tree[deep,i]num[mid])or((tree[deep,i]=num[mid])and(same>0))then// phân phối đến bên trái điều kiệnbeginflag:=1;tree[deep+1,ls]:=tree[deep,i];inc(ls);iftree[deep,i]=num[mid]then// cân bằng tả hữu cái sốdec(same);endelsebegintree[deep+1,rs]:=tree[deep,i];inc(rs);end;toleft[deep,i]:=toleft[deep,i-1]+flag;end;Build(left,mid,deep+1);// tiếp tụcBuild(mid+1,right,deep+1);end;
Tuần tra
Chúng ta đây trước xả một chút chủ tịch thụ nội dung. Ở dùng chủ tịch thụ cầu khu gian đệKhi còn nhỏ, chúng ta lấyLàm cơ sở chuẩn, hướng tả liền hướng tả, hướng hữu muốn giảm đi hướng tả giá trị, ở phân chia thụ trung cũng là cái dạng này.
Tuần tra khó lý giải, ở chỗKhu gian thu nhỏ lạiLoại đồ vật này. Hạ đồ, tuần tra chính làĐến,Như vậy tiếp theo tầng cũng chỉ yêu cầu tuần traĐến.Đương nhiên, chúng ta định nghĩaVì thu nhỏ lại sau khu gian ( mục tiêu khu gian ),Vẫn là nơi tiết điểm khu gian. Kia vì cái gì muốn tiêu ra mục tiêu khu gian đâu? Bởi vì đó làPhán định đáp án bên trái biên vẫn là bên phải tiêu chuẩn cơ bản.
Thực hiện
12345678910111213141516
functionQuery(left,right,k,l,r,deep:longint):longint;varmid,x,y,cnt,rx,ry:longint;beginifleft=rightthen// viết thành l=r cũng không sao, bởi vì mục tiêu khu gian cũng nhất định có đáp ánexit(tree[deep,left]);mid:=(l+r)>>1;x:=toleft[deep,left-1]-toleft[deep,l-1];// l đến left đi tả nhi tử cái sốy:=toleft[deep,right]-toleft[deep,l-1];// l đến right đi tả nhi tử cái sốry:=right-l-y;rx:=left-l-x;// ry là l đến right đi hữu nhi tử cái số,rx còn lại là l đến left đi hữu nhi tử cái sốcnt:=y-x;// left đến right tả nhi tử cái sốifcnt>=kthen// chủ tịch thụ thường thức lạpQuery:=Query(l+x,l+y-1,k,l,mid,deep+1)// l+x chính là thu nhỏ lại bên trái giới,l+y-1 chính là thu nhỏ lại hữu khu gian. Đối với thượng đồ tới nói, chính là đem tiết điểm 1 cùng 2 từ bỏ.elseQuery:=Query(mid+rx+1,mid+ry+1,k-cnt,mid+1,r,deep+1);// đồng dạng là thu nhỏ lại khu gian, chẳng qua biến thành bên phải mà thôi. Chú ý muốn đem k giảm đi cnt.end;
Tính chất
Thời gian phức tạp độ: Một lần tuần tra chỉ cần,Thứ dò hỏi, chính là.
Không gian phức tạp độ: Chỉ cần tồn trữCái con số.
Thân trắc kết quả: Chủ tịch thụ:,Phân chia thụ:.( phi đệ quy, hằng số tương đối tiểu )
Đề ý bản tóm tắt: Cấp định một cáiCái nguyên tố sắp hàng (), có m thứ dò hỏi (), mỗi lần xóa đi sắp hàng trung một số, cầu xóa đi cái này số lúc sau sắp hàng nghịch tự đối cái số.
Này đề có thể sử dụng CDQ ởThời gian cậpKhông gian nội giải quyết, hơn nữa CDQ hằng số cũng thực ưu tú.
Nếu đề này sửa vì cưỡng chế tại tuyến, tắc giống nhau sử dụng thụ trạng số tổ + chủ tịch thụ thụ bộ thụ giải pháp giải quyết, thời gian phức tạp độ vì,Không gian phức tạp độ vì,Hằng số lược đại, đồng dạng có thể quá này đề.
Mà sử dụng phân chia thụ nói liền có thể ởThời gian cậpKhông gian nội tại tuyến giải quyết chủ đề, đồng thời hằng số cũng so thụ bộ thụ giải pháp giảm rất nhiều. ( đại khái cùng CDQ tương đương. )
Chú ý: Vì biên trình thực hiện phương tiện, bổn văn y theo vị trí trung gian giá trị đem toàn cục tổ phân chia vì hai cái số nhỏ tổ, tức bên dưới trung phân chia thụ tương đương với là gộp vào bài tự quá trình, mà phi nhanh chóng bài tự quá trình. Tầng cao nhất toàn cục tổ vì có số thứ tự tổ, tầng chót nhất vì nguyên số tổ.
Đối với mỗi một cái phân chia thụ trung tiết điểm, chúng ta xưng hắn vì hữu tiết điểm đương thả chỉ đương hắn tại hạ một tầng sẽ bị phân chia đến hữu hài tử, tức nguyên số tổ trung vị trí tương đối dựa sau những cái đó số, tương tự có thể định nghĩa tả tiết điểm. Nếu ở thành tựu trong quá trình đem tầng cao nhất bài vì có tự, cùng loại vu quy song song tự cầu nghịch tự đối, có thể phát hiện một số tổ nghịch tự đối cái số chính là ở mỗi cái tả tiết điểm phía trước hữu tiết điểm cái thụ cùng.
Lại suy xét xóa bỏ thao tác. Xóa bỏ một cái tả tiết điểm sẽ đem toàn bộ số tổ nghịch tự đối giảm bớt ở hắn phía trước hữu giao điểm cái số, mà xóa bỏ một cái hữu tiết điểm sẽ giảm bớt ở hắn lúc sau tả tiết điểm cái số. Như vậy có thể suy xét mỗi lần động thái giữ gìn “Mỗi một cái tả tiết điểm phía trước hữu giao điểm cái số” cùng “Mỗi một cái hữu tiết điểm lúc sau tả tiết điểm cái số”. Này có thể sử dụng thụ trạng số tổ đơn giản giữ gìn.
Yêu cầu chú ý chính là, ở sử dụng thụ trạng số tổ giữ gìn khi chỉ có thể tính toán ở phân chia thụ trung cùng khối nội cống hiến, mà không thể nhảy ra khối. Đối với thụ trạng số tổ tới nói có một cái tương đối xảo diệu xử lý phương thức.
Suy xét phân chia trên cây mỗi một khối hạ tiêu phạm vi khẳng định vìHình thức, liệt kê như sau ( bởi vì số hiệu trung sẽ không đề cập đến phân chia thụ tầng chót nhất xử lý, bởi vậy chỉ cái giơ lên đếm ngược tầng thứ hai ):
Hồi ức một chút thụ trạng số tổ nguyên lý, ở hướng về phía trước nhảy thời điểm, chúng ta mỗi lầnx += lowbit(x).Nếu ở hướng về phía trước nhảy thời điểm có thể bảo đảm không nhảy ra khối, liền có thể bảo đảm chỉ biết ảnh hưởng đến khối nội nguyên tố giá trị. Hướng về phía trước tuần tra cũng cùng loại.
Mà nếu muốn ở hướng về phía trước nhảy đồng thời bảo đảm không nhảy ra khối, chỉ cần bảo đảm ở nhảy thời điểm thỏa mãnLà được.
Mà xuống phía dưới nhảy còn lại là hoàn toàn bất đồng xử lý phương thức. Mỗi một khối hạ tiêu nếu sử dụng 0-index tỏ vẻ nói, tức vìHình thức. Như vậy, chỉ cần đem mỗ một cái hạ bia giá trị hữu di chuyển vị trí k, có thể đến ra nó ở đâu một khối trung. Ở xuống phía dưới nhảy thời điểm thời khắc phán đoán hay không nhảy ra khối là được.
Yêu cầu chú ý chính là, ấn này một phương pháp thực hiện thụ trạng số tổ sẽ phỏng vấn đến lớn nhất hạ tiêu là khoảng cách n gần nhất 2 chỉnh thứ mịch, bởi vậy số tổ hạ tiêu không thể khai n.
Bởi vì yêu cầu ởTầng sửa chữa, ở đệTầng sửa chữa thời gian phức tạp độ vì,Cuối cùng thời gian phức tạp độ tức vì.
#include<algorithm>#include<cstdio>#include<cstring>usingnamespacestd;typedeflonglonglld;intgetint()// chủ đề không có số âm đưa vào, bởi vậy mau đọc không cần phán đoán dấu trừ.{charch;while((ch=getchar())'!');intx=ch^'0';while((ch=getchar())>'!')x=(x*10)+(ch^'0');returnx;}voidputll(lldx){// phát ra long longif(x/10)putll(x/10);putchar((x%10)^'0');}intti[2][17][131073];intlowbit(intx){returnx&(-x);}voidfixup(intk,intx){for(;lowbit(x)1k;x+=lowbit(x)){++ti[0][k-1][x];}++ti[0][k-1][x];}voidfixdown(intk,intx){for(;((x^lowbit(x))-1)>>k==(x-1)>>k;x^=lowbit(x)){++ti[1][k-1][x];}++ti[1][k-1][x];}intqueryup(intk,intx){intres=0;for(;lowbit(x)1k;x+=lowbit(x)){res+=ti[1][k-1][x];}returnres+ti[1][k-1][x];}intquerydown(intk,intx){intres=0;for(;((x^lowbit(x))-1)>>k==(x-1)>>k;x^=lowbit(x)){res+=ti[0][k-1][x];}returnres+ti[0][k-1][x];}intai[100005];inttx[100005];lldmgx(int*npi,int*nai,int*rxi,int*lxi,intal,intar,intbl,intbr){intrx=1;intlx=ar-al;lldres=0;for(;al!=ar||bl!=br;++npi,++nai,++rxi,++lxi){if(al!=ar&&(bl==br||tx[al]tx[bl])){--lx;*rxi=rx;*nai=tx[al];*npi=al;++al;}else{++rx;*lxi=lx;res+=ar-al;*nai=tx[bl];*npi=bl;++bl;}}returnres;}intnpi[1700005];intnri[1700005];intnli[1700005];intmain(){constintn=getint();constintm=getint();for(inti=1;in;++i){ai[i]=getint();}if(n==1){for(inti=1;im;++i){putchar('0');putchar('\n');}return0;}constintlogn=31-__builtin_clz(n-1);lldans=0;for(inti=logn;i>=0;--i){memcpy(tx,ai,(n+1)*sizeof(int));for(intj=1;jn;j+=1(logn-i+1)){ans+=mgx(npi+n*i+j,ai+j,nri+n*i+j,nli+n*i+j,j,min(n+1,j+(1(logn-i))),min(n+1,j+(1(logn-i))),min(n+1,j+(1(logn-i+1))));}}putll(ans);putchar('\n');for(intasdf=1;asdfm;++asdf){intx=getint();for(inti=0,p=0;ilogn;++i,p+=n){if(nri[p+x]){ans-=nri[p+x]-querydown(logn-i+1,x)-1;fixdown(logn-i+1,x);}else{ans-=nli[p+x]-queryup(logn-i+1,x);fixup(logn-i+1,x);}x=npi[p+x];}putll(ans);putchar('\n');}}