分治总结+oj例题思路



分治总结

一.

分治是一种扩大了的二分。即把一个大问题化成几个小问题来解决,和贪心有相似但也有区分。

鉴于oj未刷完,这里总结等刷完了再补充。

二.例题总结

1.03:区间合并”

   拿到题以为是水题,直接上结构体排序输出。当然WA了。百思不得其解后百度给了我答案。

   如果某一个区间的右端点十分靠右,那最终合并后的区间的右端点不应该是最右的那个吗?

   于是吸取到了教训:不要小看任何题。

   详情:

http://blog.csdn.net/qq_26140973/article/details/53453782

201:2011

   题是水题,深度理解打表的精髓。。。坑的是用高精度,被坑了好几次。把这道题放在这里的目的是时刻提醒自己审题!

3.04:求排列的逆序数”

   最强题来了!

   这道题要用到二分归并排序的思路,贼难。

上代码以后复习用:

#include
#include
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    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>num[i];
        db(0,n-1);
        cout<
        return 0;

}

 

你可能感兴趣的:(分治总结+oj例题思路)