题目出处

题意描述:

这个题目提问的是,在插入排序的序列给定的情况下,求最少需要移动的次数。

序列的长度n <=10^5

序列中的元素a[i] <=10^6

一组数据中case数t <=5

题目分析:

这个题,拿到题目一眼望去满满的都是暴力的影子(又傻逼了)。

然后仔细分析一下暴力的复杂度,每插入一个元素都要扫过一边数组,显而易见的O(n*n),TLE思密达。

然后再认真分析一下题目,所求最少的移动次数,也就是说:对于其中任意一个元素a[i],只需要求出从a[1]到a[i-1]中大于a[i]的数字的数量。

说白了就是逆序数。。。

之后就是寻找一种数据结构或者算法可以在o(n)更短的时间内求出逆序数

动手:

线段树和树状数组十分适合这题,于是研习一下百度搜到的神牛的代码,迅速山寨了一个线段树的代码。

 #include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std; const int MAXN = +; struct Node{
int a,b,left,right,val;
}; Node tree[MAXN*];
int L = ;
int a[+]; void B( int x, int y ){
//cout<<x<<" "<<y<<endl;
int This = L;
tree[This].a = x;
tree[This].b = y;
tree[This].val = ;
if ( y - x >= ){
int mid = (x+y)/;
L++;
tree[This].left = L;
B(x,mid);
L++;
tree[This].right = L;
B(mid+,y);
}
//cout<<"DONE "<<x<<" "<<y<<endl;
} void I( int x, int y, int t ){
//cout<<"I "<<x<<" "<<y<<" "<<t<<endl;
if ( ( x <= tree[t].a ) && ( y >= tree[t].b ) ){
tree[t].val++;
}else{
tree[t].val++;
int mid = (tree[t].a+tree[t].b)/;
if ( x <= mid ){
I(x,y,tree[t].left);
}
if ( y >= mid+ ){
I(x,y,tree[t].right);
}
}
} int S( int x, int y, int t ){
if ( tree[t].val == ){
return ;
}
if ( ( x<= tree[t].a ) && ( y >= tree[t].b ) ){
return tree[t].val;
}else{
int mid = (tree[t].a+tree[t].b)/;
int ans = ;
if ( x <= mid ){
ans += S(x,y,tree[t].left);
}
if ( y >= mid+ ){
ans += S(x,y,tree[t].right);
}
return ans;
}
} int G( int x, int y ){
return S(,y,)-S(,x,);
} void show(int k){
for ( int i = ; i<= k; i++ ){
cout<<i<<" f "<<tree[i].a<<" t "<<tree[i].b<<" "<<tree[i].left<<" "<<tree[i].right<<" "<<tree[i].val<<endl;
}
} void solve(){
int n;
cin>>n;
int i = ;
int MAX = ;
long long ans = ;
int MIN = +;
memset(a,,sizeof(a));
for ( i = ; i < n; i++ ){
cin>>a[i];
if ( MAX < a[i] ){
MAX = a[i];
}
if ( MIN > a[i] ){
MIN = a[i];
}
}
//cout<<MAX<<endl;
//cout<<MIN<<endl;
B(MIN-,MAX);
//show(L);
//cout<<"sb"<<endl;
for ( i = ; i < n; i++ ){
I(a[i],a[i],);
ans += G(a[i],MAX);
}
cout<<ans<<endl;
} int main() {
int t;
int i;
cin>>t;
for ( i = ; i <t; i++ ){
L = ;
solve();
}
return ;
}

线段树

想起来个要命的事儿就是用python3写会超时,可能是python内部开内存的方式比较慢,不像C++写在外面,是直接开出来的。

这题后来拿给狗哥做了一发,结果用了个树状数组就给我平了,,,虽然差不大多,但是代码量要小很多,看来需要研习一下了。

线段树解Insertion Sort Advanced Analysis的更多相关文章

  1. 【HackerRank】Insertion Sort Advanced Analysis(归并排序求数列逆序数对)

    Insertion Sort is a simple sorting technique which was covered in previous challenges. Sometimes, ar ...

  2. 线段树解LIS

    先是nlogn的LIS解法 /* LIS nlogn解法 */ #include<iostream> #include<cstring> #include<cstdio& ...

  3. cf1132G 线段树解分区间LIS(一种全新的线段树解LIS思路)+单调栈

    /* 给定n个数的数列,要求枚举长为k的区间,求出每个区间的最长上升子序列长度 首先考虑给定n个数的数列的LIS求法:从左往右枚举第i点作为最大点的贡献, 那么往左找到第一个比a[i]大的数,设这个数 ...

  4. POJ - 3264 Balanced Lineup 线段树解RMQ

    这个题目是一个典型的RMQ问题,给定一个整数序列,1~N,然后进行Q次询问,每次给定两个整数A,B,(1<=A<=B<=N),求给定的范围内,最大和最小值之差. 解法一:这个是最初的 ...

  5. 1521. War Games 2(线段树解约瑟夫)

    1521 根据区间和 来确定第k个数在哪 #include <iostream> #include<cstdio> #include<cstring> #inclu ...

  6. poj2299--B - Ultra-QuickSort(线段树,离散化)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 41215   Accepted: 14915 ...

  7. hdu 1394 Minimum Inversion Number(这道题改日我要用线段树再做一次哟~)

    Problem Description The inversion number of a given number sequence a1, a2, ..., an is the number of ...

  8. cf842D 01字典树|线段树 模板见hdu4825

    一般异或问题都可以转换成字典树的问题,,我一开始的想法有点小问题,改一下就好了 下面的代码是逆向建树的,数据量大就不行 /*3 01字典树 根据异或性质,a1!=a2 ==> a1^x1^..^ ...

  9. 816B. Karen and Coffee 前缀和思维 或 线段树

    LINK 题意:给出n个[l,r],q个询问a,b,问被包含于[a,b]且这样的区间数大于k个的方案数有多少 思路:预处理所有的区间,对于一个区间我们标记其(左边界)++,(右边界+1)--这样就能通 ...

随机推荐

  1. iOS国际化支持

    写给自己看: 1.先创建一个国际化文件,用于描述在不同的区域环境,显示不同的value.文件名必须是Localizable.strings,文件的内容稍后再写.

  2. springmvc学习笔记(理论)

    1.springmvc是什么? Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层 进行职责解耦,基 ...

  3. JavaScript自动关闭窗口

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. asp.net错误日志写入

    当我们一个web项目开发已完成,测试也通过了后,就把他放到网上去,但是,bug是测不完的,特别是在一个大的网络环境下.那么,我们就应该记录这些错误,然后改正.这里,我的出错管理页面是在global.a ...

  5. 关于Linux下面msyql安装后并未设置初始密码,但是登录报错“Access denied for user 'root'@'localhost' (using password: NO)”的解决方案

    如上图:首先我安装mysql的时候并没有设置密码,但是就是登不进去,百度了一下,解决方案如下: 解决方案地址:http://zhidao.baidu.com/link?url=7QvuOKtfRdMT ...

  6. Mysql 中is null 和 =null 的区别

    在mysql中,筛选非空的时候经常会用到is not null和!=null,这两种方法单从字面上来看感觉是差不多的,其实如 果去运行一下试试的话差别会很大! 为什么会出现这种情况呢? null 表示 ...

  7. Delphi 封装Frame到Dll文件

    做项目的时候,发现这个Frame很好用,为了省空间.调用和修改方便,就将Frame封装到dll(动态链接库)里面,确实很好使. 效果图如下: 上图是临时测试用的,忘了将Frame的align设置成al ...

  8. extjs中rowEditing动态编辑

    我们在使用Grid的rowEditing插件时希望能够根据自己的业务需求能够动态的实现那一列是用户可以编辑的,那一列用户不可编辑,下面给出一个方案能够实现rowEditing的动态编辑功能. 之前我通 ...

  9. [javascript]事件冒泡处理

    <!DOCTYPE html> <html> <head> <style type="text/css"> #box1 { widt ...

  10. php防止SQL注入详解及防范

    SQL 注入是PHP应用中最常见的漏洞之一.事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义( ...