NOIP 2013 火柴排队 程序

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN = 100000 + 1;
 4 const int MOD = 99999997;
 5 int n, F[MAXN], C[MAXN];
 6 struct node
 7 {
 8     int N, H;
 9 }Match1[MAXN], Match2[MAXN];
10 void Update(int x)
11 {
12     for (int i = x; i <= n; i += i&(-i))
13         F[i]++;
14 }
15 int Query(int x)
16 {
17     int S = 0;
18     for (int i = x; i > 0; i -= i&(-i))
19         S += F[i];
20     return S;
21 }
22 bool comp(node x, node y)
23 {
24     return x.H < y.H;
25 }
26 int main()
27 {
28     cin >> n;
29     for (int i = 1; i <= n; i++)
30     {
31         cin >> Match1[i].H;
32         Match1[i].N = i;
33     }
34     for (int i = 1; i <= n; i++)
35     {
36         cin >> Match2[i].H;
37         Match2[i].N = i;
38     }
39     sort(Match1 + 1, Match1 + (n+1), comp);
40     sort(Match2 + 1, Match2 + (n+1), comp);
41     for (int i = 1; i <= n; i++)
42     {
43         C[Match1[i].N] = Match2[i].N;
44     }
45     int Sum = 0;
46     for (int i = 1; i <= n; i++)
47     {
48         Update(C[i]);
49         Sum += i-Query(C[i]);
50         Sum %= MOD;
51     }
52     cout << Sum << endl;
53     return 0;
54 }

https://paste.ubuntu.com/p/Ckw9kpZ9qw/

原文地址:https://www.cnblogs.com/OIerPrime/p/8976485.html

时间: 2024-10-14 07:30:58

NOIP 2013 火柴排队 程序的相关文章

水题 逆序对 NOIP 2013 火柴排队

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

NOIP 提高组2013 火柴排队 (Vijos P1842)

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

【NOIP】提高组2013 火柴排队

[算法]求逆序对(树状数组)(也可以用归并排序等) [题解] 学自:http://blog.csdn.net/greatwjj/article/details/16808243 https://vijos.org/p/1842/solution(从下往上第三个回答) 因此要使结果最小,只要最大化aibi(i=1...n),即使小的数对应小的数,大的数对应大的数. 1.对于数列a,b先离散化,将他们值替换为他们在所在数列的排名. 2.令数列c记录a中每个数应该在b中的位置(a的目标位置). 3.对

noip提高组2013 火柴排队

题目链接:https://www.luogu.org/problem/show?pid=1966 这个题啊,naive(虽然我不会证明). 举了个特例,得出结论:对于两列数,一定是最大与最大的相对,最小的与最小的相对. 然后就以离散化一下,然后随便用个树状数组求个逆序对就好了. 一开始我还分别写了两个逆序对,想求个差的绝对值,发现样例过不了之后...... #include<cstdio>#include<algorithm>using namespace std;const in

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

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

NOIp 2013 Day1 解题报告

NOIp 2013 Day1 解题报告 1.   转圈游戏 不难看出答案就是(x+m*10k) mod n 用快速幂算法,复杂度O(log2k) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable// 9 int n,m,x,

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

NOIP 2013 火车运输【Kruskal + 树链剖分】

NOIP 2013 火车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物. 输入描述 Input Description 第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道路.接下来 m 行每行 3 个整数 x.y.z,每两个整数之间用一个空格隔开,表示