分治总结
一.
分治是一种扩大了的二分。即把一个大问题化成几个小问题来解决,和贪心有相似但也有区分。
鉴于oj未刷完,这里总结等刷完了再补充。
二.例题总结
1.“03:区间合并”
拿到题以为是水题,直接上结构体排序输出。当然WA了。百思不得其解后百度给了我答案。
如果某一个区间的右端点十分靠右,那最终合并后的区间的右端点不应该是最右的那个吗?
于是吸取到了教训:不要小看任何题。
详情:
http://blog.csdn.net/qq_26140973/article/details/53453782
2.“01:2011”
题是水题,深度理解打表的精髓。。。坑的是用高精度,被坑了好几次。把这道题放在这里的目的是时刻提醒自己审题!
3.“04:求排列的逆序数”
最强题来了!
这道题要用到二分归并排序的思路,贼难。
上代码以后复习用:
#include<iostream>
#include<cstdio>
using namespace std;
int n,num[100001],tmp[100001];
long long tol=0;
void gui(int l,int r) {
if(l>=r) return;
int m=(l+r)/2;
int i=l,j=m+1,k=0;
while(i<=m&&j<=r) {
if(num[i]>num[j]) {
tmp[k++]=num[j++];
tol+=m-i+1;
} else {
tmp[k++]=num[i++];
}
}
while(i<=m) tmp[k++]=num[i++];
while(j<=r) tmp[k++]=num[j++];
for(i=0; i<k; i++) num[i+l]=tmp[i];
}
void db(int l,int r) {
if(l>=r) return;
int m=(l+r)/2;
db(l,m);
db(m+1,r);
gui(l,r);
}
int main() {
cin>>n;
for(int i=0; i<n; i++) cin>>num[i];
db(0,n-1);
cout<<tol;
return 0;