火柴排队——重温逆序对

  在vijos 的NOIP 历年题库中瞄到的,搞了搞。看来的确我刚开始学归并逆序对的时候就是一塌糊涂,据说还有树状数组求法,但是我树状数组更是一塌糊涂,以后再来加吧。

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdio>
 4 using namespace std;
 5 const int N=100086,M=99999997;
 6 struct node{
 7     int x,p;
 8     bool operator < (const node oth) const {return x<oth.x;}
 9 }l[N],r[N];
10 int n,res,val[N],t[N];
11 void merge(int l,int mid,int r){
12     int pl=l,pr=mid+1;
13     for(int i=l;i<=r;i++)
14         if((pl<=mid)&&(pr>r||val[pl]<=val[pr]))
15             t[i]=val[pl++];
16         else
17             t[i]=val[pr++],res=(res+mid-pl+1)%M;
18     for(int i=l;i<=r;i++)val[i]=t[i];
19 }
20 void com(int l,int r){
21     if(l<r){
22         int mid=(l+r)>>1;
23         com(l,mid);
24         com(mid+1,r);
25         merge(l,mid,r);
26     }
27 }
28 int main(){
29     cin>>n;
30     for(int i=1;i<=n;i++)scanf("%d",&l[i].x),l[i].p=i;
31     for(int i=1;i<=n;i++)scanf("%d",&r[i].x),r[i].p=i;
32     sort(l+1,l+1+n);sort(r+1,r+1+n);
33     for(int i=1;i<=n;i++)val[l[i].p]=r[i].p;
34     com(1,n);
35     cout<<(res%M)<<endl;
36     return 0;
37 }

Method_01

  vijos 129ms CodeVS 116ms

时间: 2024-10-12 08:09:14

火柴排队——重温逆序对的相关文章

LG-P2804 神秘数字/LG-P1196 火柴排队 归并排序, 逆序对

P2804-神秘数字 题目描述(简化版) 有 n 个数,求这 n 个数中,有多少个连续的数的平均数大于某个给定的数 M? 注意:这个数可能会很大,请输出这个数对92084931取模的结果. 输入输出格式 输入格式: 共两行. 第一行为两个数 n 和 M. 第二行为 n 个数. 输出格式: 一行一个数,即问题的解对92084931取模的结果 输入输出样例 输入样例#1: 4 3 1 5 4 2 输出样例#1: 5 输入样例#2: 4 4 5 2 7 3 输出样例#2: 6 说明 [样例解释] ①对

Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对

题目:http://codevs.cn/problem/3286/ 3286 火柴排队  2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:,其中 ai表示第一列火柴中第 i 个火柴的高度,bi表示第二列火柴中第 i 个火柴的高度.每列火柴中相

luogu P1966 火柴排队 (逆序对)

luogu P1966 火柴排队 题目链接:https://www.luogu.org/problemnew/show/P1966 显然贪心的想,排名一样的数相减是最优的. 证明也很简单. 此处就不证明了. 然后交换的话就是求一个逆序对. 怎么样排序是一个关键. \(c\)数组的下标是\(a\)的排名,值是\(b\)的值. 这样求逆序对的时候,就是排名为\(i\)的\(a\)数组,会对应上相应排名的\(b\)数组的上. 这也算是一个小技巧吧. #include <algorithm> #inc

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

P1966 火柴排队 很好的逆序对板子题: 求的是(x1-x2)*(x1-x2)的最小值: x1*x1+x2*x2-2*x1*x2 让x1*x2最大即可: 可以证明将b,c数组排序后,一一对应的状态是最大的: ac+bd<ad+bc ac-ad<bc-bd a*(c-d)<b*(c-d)//c-d<0 a>b(???) 逆序对合并时一定要加等号!!要判断q1是否超出mid!!!(爆零体验): 归并写法 #include<cstdio> #include<cs

水题 逆序对 NOIP 2013 火柴排队

题目如下 题目描述 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:,其中 ai表示第一列火柴中第 i 个火柴的高度,bi表示第二列火柴中第 i 个火柴的高度.每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小.请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果. 输入描述 Inp

蓝桥杯小朋友排队(树状数组求逆序对)

居然存在身高为0的数据... 树状数组求逆序对原理: add(h[j],1); //将身高为h[j]的数据的出现次数加1 sum(h[j]);//求i<j 且 h[i] <=h[j] 的数据出现次数之和  那么 i-sum(h[j]) 为 i > j 且 h[i] > h[j] 数据的出现次数之和 即为 逆序对数 #include"cstdio" #include"cstring" #define lowbit(i) i&(-i) u

luogu P1966 火柴排队

二次联通门 : luogu P1966 火柴排队 /* luogu P1966 火柴排队 神TM逆序对... noip怎么这么坑啊.. 暴力都没得打 此题模拟考试时爆了0 做法 将A数组排序,由于B数组与A数组是一一对应的 那么B数组的位置也会发生相应的变化 此时B数组逆序数对数即为答案 */ #include <cstdio> #include <iostream> #include <algorithm> const int BUF = 123123123; cha

【NOIP2013】火柴排队

P1092 - [NOIP2013]火柴排队 Description Input 共三行,第一行包含一个整数 n,表示每盒中火柴的数目. 第二行有 n 个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度. 第三行有 n 个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度. Output 输出共一行,包含一个整数,表示最少交换次数对 99,999,997 取模的结果. Sample Input 样例1: 4 2 3 1 4 3 2 1 4 样例2: 4 1 3 4 2 1 7 2

Codevs 3286 火柴排队

3286 火柴排队 题目描述 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:,其中 ai表示第一列火柴中第 i 个火柴的高度,bi表示第二列火柴中第 i 个火柴的高度.每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小.请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果. 输入描