分治总结+oj例题思路



分治总结

一.

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

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

二.例题总结

1.03:区间合并”

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

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

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

   详情:

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

201: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;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值