这道题从看到它开始到做出来,已经过了快两周【因为第一次思路完全跑偏写的是暴力模拟想水过】;

  题意是这样的:

     jzabc除了对多米诺骨牌感兴趣外,对赛车也很感兴趣。上个周末他观看了一场赛车比赛。他总是能想出许多稀奇的问题。某一时刻,他看到有n辆车(总是匀速行驶)在同一直线上,并且处在一个无限长度的直道上,而且n辆车有严格的先后之分。他通过特殊的器材测出了每一辆车的速度。那么问题出现了,如果有两辆车A车和B车,A车在B车的后面,并且A车的速度比B车的快,那么经过一段时间后,A车一定会超过B车。我们称之为一次超车。那么他想请你帮忙计算超车总数。我们记车道起点的坐标为0。没有两辆车的坐标相同。

  输入:

    第一行,一个数n,车辆总数。
    第二行至第n+1行,为n辆车的信息
    每行有两个正整数x,y,x和y之间有一个空格
    x为车的坐标,y为车的速度
    0<x,y<=1000000000

  输出:超车总数【逆序对个数】

    先说说我第一次没看书理解的题意:开一个结构体,按坐标从小到大sort记录位次,然后sort按速度排序,用总数减去每次的位次,然后累加。后来发现如果速度大的在前次大的数不可能超过,而记录它之前的车总数-1不管从时间上还是从策略上都很难满足【已经按速度排序不可能从1循环到这辆车】。

    然后从书上看到了这道题,本来准备看代码试一下,然后yyx同学告诉我这个代码完全是个bug,我就信了,根本不敢打,事实上证明书上的代码是正确的orz

    事实证明自己努力想一些东西还是好的。解题思路大概就是将序列分开然后排序,然后把两个排过的合并。因为两边的序列有序,那么在一边选取的数和另一边比较,前面的数肯定全

  都是逆序的。将排序和统计同时进行,不会影响最终答案。ps:注意统计数据量...会爆掉int

  下面放代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
long long ans=;
struct qaq
{
int x;
int y;
};
qaq car[];
int c[];
int a[]; bool mycmp(qaq a,qaq b)
{return a.x<b.x;} void init()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d",&car[i].x,&car[i].y);
sort(car+,car++n,mycmp);
for(int i=;i<=n;i++)
a[i]=car[i].y;
//for(int i=1;i<=n;i++) cout<<a[i]<<' '; cout<<endl<<"----------------";
} void work(int l,int r)
{
int i,j,mid,temp; if(l+<r)
{
mid=(l+r)/;
work(l,mid-);
work(mid,r);
temp=l;
for(i=l,j=mid;(i<=mid-)&&(j<=r);)
{
if(a[i]>a[j])
{
c[temp++]=a[j++];
ans+=mid-i;
}
else c[temp++]=a[i++];
} if(j<=r)
{
for(;j<=r;j++) c[temp++]=a[j];
}
else
{
for(;i<=mid-;i++) c[temp++]=a[i];
} for(int i=l;i<=r;i++) a[i]=c[i];
} else
{
if(l+==r)
{
if(a[l]>a[r])
{
int tt=a[r];
a[r]=a[l];
a[l]=tt;
ans++;
}
}
}
} int main()
{
init();
work(,n);
cout<<ans<<endl;
return ;
}

P1136 超车 归并排序 求逆序对个数的更多相关文章

  1. POJ 2299 求逆序对个数 归并排序 Or数据结构

    题意: 求逆序对个数 没有重复数字 线段树实现: 离散化. 单点修改,区间求和 // by SiriusRen #include <cstdio> #include <cstring ...

  2. 2014 HDU多校弟五场A题 【归并排序求逆序对】

    这题是2Y,第一次WA贡献给了没有long long 的答案QAQ 题意不难理解,解题方法不难. 先用归并排序求出原串中逆序对的个数然后拿来减去k即可,如果答案小于0,则取0 学习了归并排序求逆序对的 ...

  3. 归并排序&&归并排序求逆序对

    归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序 ...

  4. 【BZOJ4769】超级贞鱼 归并排序求逆序对

    [BZOJ4769]超级贞鱼 Description 马达加斯加贞鱼是一种神奇的双脚贞鱼,它们把自己的智慧写在脚上——每只贞鱼的左脚和右脚上各有一个数.有一天,K只贞鱼兴致来潮,排成一列,从左到右第i ...

  5. 归并排序+归并排序求逆序对(例题P1908)

    归并排序(merge sort) 顾名思义,这是一种排序算法,时间复杂度为O(nlogn),时间复杂度上和快排一样 归并排序是分治思想的应用,我们先将n个数不断地二分,最后得到n个长度为1的区间,显然 ...

  6. 归并排序求逆序对(poj 2299)

    归并排序求逆序对 题目大意 给你多个序列,让你求出每个序列中逆序对的数量. 输入:每组数据以一个数 n 开头,以下n行,每行一个数字,代表这个序列: 输出:对于输出对应该组数据的逆序对的数量: 顺便在 ...

  7. poj2299(归并排序求逆序对)

    题目链接:https://vjudge.net/problem/POJ-2299 题意:给定一个序列,每次只能交换邻近的两个元素,问要交换多少次才能使序列按升序排列. 思路:本质就是求逆序对.我们用归 ...

  8. 浙江工商大学15年校赛I题 Inversion 【归并排序求逆序对】

    Inversion Time Limit 1s Memory Limit 131072KB Judge Program Standard Ratio(Solve/Submit) 15.00%(3/20 ...

  9. HDU 3743 Frosh Week(归并排序求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3743 题目意思就是给你一个长为n的序列,让你求逆序对.我用的是归并排序来求的.归并排序有一个合并的过程 ...

随机推荐

  1. python模块之pickle

    和json不同的是: json只支持str,int,tuple,list,dict. pickle支持python里所有的数据类型,但是只能在python里序列化,不跨平台,python独有. 代码示 ...

  2. __vet_atags

    参考:atags--__vet_atags标签    arch/arm/include/asm/setup.h /* * linux/include/asm/setup.h * * Copyright ...

  3. Nordic Collegiate Programming Contest 2015​ G. Goblin Garden Guards

    In an unprecedented turn of events, goblins recently launched an invasion against the Nedewsian city ...

  4. linux笔记(1)

    1)useradd+用户名 添加一个普通用户2)passwd+密码 为用户加密码3)su - 用户名 切换用户4)whoami 查看当前用户是什么5)$符号是普通用户#是超级用户6)mkdir /da ...

  5. strcpy和strncpy用法和区别

    1. strcpy函数:顾名思义字符串复制函数:原型:extern char *strcpy(char *dest,char *src); 功能:把从src地址开始且含有NULL结束符的字符串赋值到以 ...

  6. 剑指offer算法编程题目部分汇总(解法略)

    总结一下本书中遇到的大部分面试题.面试题3:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右的递增顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个整数,判断数 ...

  7. 添加rpmforge源 centos 7

    (原创)RHEL/CentOS 7.x使用EPEL第三方yum源 时间 2014-07-22 19:45:50 服务器运维与网站架构 原文  http://www.ha97.com/5649.html ...

  8. Sogou日志分析(hive)

    1. 数据准备 1.1 数据预先放在mac本地桌面的“VB共享文件夹”中,从VisualBox虚拟机中/mnt/VBShare共享目录中转移到resources目标目录. [cloudera@quic ...

  9. java面试题之什么是多线程上下文切换

    多线程会共同使用一组计算机上的CPU,而线程数大于给程序分配的CPU数量时,为了让各个线程都有执行的机会,就需要轮流使用CPU.不同的线程切换使用CPU发生的数据切换等就是上下文切换

  10. 使用JWT实现Token认证

    为什么使用JWT? 随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用 ...