这道题需要小小的思考一波

(然而我思考了两节课)

好,我们先得出一个结论:a中第k大的与b中第k大的一定要排在一起,才能保证最小。

然后发现:挪a,b其实没有区别,故我们固定a,挪b。

然后我们就思考:只能挪相邻的,那么就是求逆序对数啊!

那么我们把这两个固定到结构体里,按a排序,求b的逆序对。

交上去,自信WA,10分。。。

让我们看一组样例:

4

4 1 2 3

3 1 2 4

显然要5下,但我的程序无情的输出了一个1

那么我们再思考:

逆序对的目的是把这些东西挪成1,2,3,4,5,6,7......

那么我们给这些东西的目标位置顺序标号1,2,3,4,5,6,7......,记为aim,分别扔到现在位置上。

这些东西现在的位置记为1,2,3,4,5,6,7......,记为num

那么我们把这些东西从num挪到aim,等效于从aim挪到num

由于num是有序的,我们求aim的逆序对就OK了!

本题并不用离散化(李三花)

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define lowbit(a) (a&(-a))
using namespace std;
const int N = ;
const int mo= ;
int n,/*x[N],*/tree[N];
struct March
{
int sum,num,aim;
}a[N],b[N];
void add(int x,int v)
{
for(int i=x;i<=n;i+=lowbit(i)) tree[i]+=v;
return;
}
int getsum(int x)
{
int ans=;
for(int i=x;i>;i-=lowbit(i)) ans+=tree[i];
return ans;
}
bool cmp1(March f,March d)
{
return f.sum<d.sum;
}
bool cmp2(March f,March d)
{
return f.num<d.num;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i].sum);
a[i].num=i;
}
for(int i=;i<=n;i++)
{
scanf("%d",&b[i].sum);
b[i].num=i;
//x[i]=b[i].sum;
}
/*
sort(x+1,x+n+1);
int k=0;
for(int i=1;i<=n;i++) if(x[i]!=x[i-1]) x[++k]=x[i];
*/
sort(a+,a+n+,cmp1);
sort(b+,b+n+,cmp1);
for(int i=;i<=n;i++) b[i].aim=a[i].num;
sort(b+,b+n+,cmp2);
int ans=;
for(int i=;i<=n;i++)
{
ans+=(i--getsum(b[i].aim));
ans%=mo;
add(b[i].aim,);
} printf("%d",ans); return ;
}

那么,AC代码在此

P1966 火柴排队的更多相关文章

  1. 【刷题】洛谷 P1966 火柴排队

    题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...

  2. [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)

    [NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...

  3. 洛谷 P1966 火柴排队 解题报告

    P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: \(\s ...

  4. luogu P1966 火柴排队 (逆序对)

    luogu P1966 火柴排队 题目链接:https://www.luogu.org/problemnew/show/P1966 显然贪心的想,排名一样的数相减是最优的. 证明也很简单. 此处就不证 ...

  5. 洛谷——P1966 火柴排队&&P1774 最接近神的人_NOI导刊2010提高(02)

    P1966 火柴排队 这题贪心显然,即将两序列中第k大的数的位置保持一致,证明略: 树状数组求逆序对啦 浅谈树状数组求逆序对及离散化的几种方式及应用 方法:从前向后每次将数插入到bit(树状数组)中, ...

  6. P1966 火柴排队(逆序对)

    P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi) ...

  7. P1966 火柴排队——逆序对(归并,树状数组)

    P1966 火柴排队 很好的逆序对板子题: 求的是(x1-x2)*(x1-x2)的最小值: x1*x1+x2*x2-2*x1*x2 让x1*x2最大即可: 可以证明将b,c数组排序后,一一对应的状态是 ...

  8. [洛谷P1966] 火柴排队

    题目链接: 火柴排队 题目分析: 感觉比较顺理成章地就能推出来?似乎是个一眼题 交换的话多半会往逆序对上面想,然后题目给那个式子就是拿来吓人的根本没有卵用 唯一的用处大概是告诉你考虑贪心一波,很显然有 ...

  9. Luogu P1966 火柴排队

    这还是一道比较简单的题目,稍微想一下就可以解决.终于有NOIP难度的题目了 首先我们看那个∑(ai-bi)^2的式子,发现这个的最小值就是排序不等式 所以我们只需要改变第一组火柴的顺序,使它和第二组火 ...

  10. 洛谷 P1966 火柴排队

    题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:∑(ai​−bi​)2 其中ai​ 表示 ...

随机推荐

  1. 日期选择器date、week、time、datetime、datetime-local类型

    下面只写两个类型的代码案例,其他都大同小异 date类型: <!DOCTYPE html> <html> <head> <meta charset=" ...

  2. AngularJS:directive自定义的指令

    除了 AngularJS 内置的指令外,我们还可以创建自定义指令. 你可以使用 .directive 函数来添加自定义的指令. 要调用自定义指令,HTML 元素上需要添加自定义指令名. 使用驼峰法来命 ...

  3. C# Note1:深入浅出WPF-MVVM篇

    一.资源说明 (1)配套视频:深入浅出WPF  讲的不错! 待更!

  4. dart正则

    1.前言 API中对于正则表达式的注释是:正则表达式的规范和语义与JavaScript相同详细的规范可以参考:http://ecma-international.org/ecma-262/5.1/#s ...

  5. prop与attr

    1.都是获取当前元素某个属性的值 2.当获取多选框的状态时,如果没有选中,此时没有checked属性,用attr获取得到undifien prop得到false. 3.html原生属性用prop获取, ...

  6. python之路--模块和包

    一 . 模块 ⾸先,我们先看⼀个老⽣常谈的问题. 什么是模块. 模块就是⼀个包含了python定义和声明的⽂件, ⽂件名就是模块的名字加上.py后缀. 换句话说我们⽬前写的所有的py⽂件都可以看成是⼀ ...

  7. 集合之ArrayList(含JDK1.8源码分析)

    一.ArrayList的数据结构 ArrayList底层的数据结构就是数组,数组元素类型为Object类型,即可以存放所有类型数据.我们对ArrayList类的实例的所有的操作(增删改查等),其底层都 ...

  8. 微服务架构中APIGateway原理

    背景 我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 Rest ...

  9. 老男孩python学习自修第二十三天【多线程】

    1. 线程的创建与运行 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from threading import Thread def foo(param1 ...

  10. vue起步和模板語法

    vue構造器里有哪些內容: var a=new Vue({}) 模板語法: 文本插值: html: html的屬性里的值應該使用v-bind: 表達式: 指令; 參數:v-bind,v-on 雙向用戶 ...