题目出处

题意描述:

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

序列的长度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. Oracle sequence排序的使用

    最近公司的项目中好多用到了Seq排序的,所以网上找些记录一下吧. 通过以下直接查询出所有的seq列表: select * from user_sequences; 查询结果如下: 查询结果和创建的基本 ...

  2. 解决zabbix图中出现中文乱码问题

    我这周部署了zabbix监控服务器,但是配置过程中发现当有中文时,图中的中文会变成方块 如下图所示: 这个问题是由于zabbix的web端没有中文字库,我们最需要把中文字库加上即可 解决办法如下 1. ...

  3. 纯css+js水平时间轴

    自定义,并自动加载时间节点 当前时间节点居中,突出显示 时间动态无痕添加 效果图: 初始状态 时间左走到一定2016.1月后 html: <!-- 水平时间轴 --> <div id ...

  4. System.Web.HttpContext.Current.Session获取值出错

    在自定义类库CS文件里使用System.Web.HttpContext.Current.Session获取Session时提示错误:未将对象引用设置到对象的实例. 一般情况下通过这种方式获取Sessi ...

  5. JSON解析之——Android

    JSON解析之——Android 一.google天气案例 之前xml学习中的google天气的例子非常形象,所以我们继续以google天气作为案例进行学习,下面是我从google官网下载下来的天气J ...

  6. MySQL 插入数据

    MySQL 插入数据 MySQL 表中使用 INSERT INTO SQL语句来插入数据. 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 语法 以下 ...

  7. Python文件之----JSON

    #coding=utf-8import json def writeJSON(filaName="test.json"): f=open(filaName, "wb&qu ...

  8. 【USACO 2.2.4】派对灯

    [描述] 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄 ...

  9. 【USACO 1.2.3】命名那个数字

    [问题描述] 在威斯康辛州牛大农场经营者之中,都习惯于请会计部门用连续数字给母牛打上烙印.但是,母牛用手机时并没感到这个系统的便利,它们更喜欢用它们喜欢的名字来呼叫它们的同伴,而不是用像这个的语句&q ...

  10. C# 根据IP查询地址归属地

    必备文件:IPLocation.dll.QQWry.Dat 下载地址:http://pan.baidu.com/s/1jG1dlOy (可百度下载) 之前有过将 QQWry.Dat 转为 Access ...