分治
void solve(n){
//边界条件,如if(n==1){...}
//把n分成若干个小问题,比如分成两个大小为n/2的子问题:solve(n/2),solve(n/2)
//合并答案 return ;
}
void solve(int l,int r){
if(l==r)
return ;
int mid=(l+r)/2;
solve(1,mid);
solve(mid+1,r);
...//归并A[l...mid]和A[mid+1...r],得到A[l...r]排好序的结果
对于一个长度为n的序列,统计符合某要求的子区间[l,r]的个数。
int solve(int l,int r){
if(l==r){...}
int cnt=0,mid=(l+r)/2;
cnt+=solve(l,mid);
cnt+=solve(mid+1,r);
...//统计左端点在[l,mid],右端点在[mid+1,r]中的答案个数,加入cnt
return cnt;