逆順 - cogs1438はキューに一致します

トピックへのリンク:http://cogs.pro:8081/cogs/problem/problem.php?pid=vimiQkqjU

説明[タイトル]

サンプル入力:

4

2 3 1 4

3 2 1 4

サンプル2 - 入力:

4

1 2 3 4

1 7 2 4

 

アイデア:[シグマ(≦iがn≦)(AI - BI)マッチボックス、最小距離のために2は  わずか約AI * BIを導入してもよく、値の値よりも大きいかまたはスクランブル等しい配列を発見し、したがってのみに必要これを行うためにBは、アイデアは、同じ相対的な順序の別のは、コードになるように最初の昇順または降順を考慮するが、好ましくは固定スイッチング周波数で最小を要求することである[I] B iは、i番目の要素を表すだけ逆に統計的である必要は、位置を表します。

コードは以下の通りであります:

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "algorithm"
 4 #define maxn 100100
 5 #define ll long long
 6 using namespace std;
 7 
 8 struct stick
 9 {
10     int length, id;
11     bool operator < (const stick& a)const
12     {
13         return length < a.length;
14     }
15 }s[maxn], d[maxn];
16 
17 ll temp[maxn], n, a[maxn];
18 ll sum = 0;
19 
20 void merge(ll b[], ll l, ll r)
21 {
22     for (int i = l; i <= r; i++)
23     {
24         temp[i] = b[i];
25     }
26     int mid = (l + r) >> 1;
27     int i = l, j = mid + 1;
28     for (int pos = l; pos <= r; pos++)
29     {
30         if (i == mid + 1)
31         {
32             a[pos] = temp[j];
33             j++;
34         }
35         else if (j == r + 1)
36         {
37             a[pos] = temp[i];
38             i++;
39         }
40         else if (temp[i] > temp[j])
41         {
42             a[pos] = temp[j];
43             j++;
44             sum += mid - i + 1;
45             sum %= 99999997;
46         }
47         else
48         {
49             a[pos] = temp[i];
50             i++;
51         }
52     }
53 }
54 
55 void msort(ll b[], ll l, ll r)
56 {
57     if (l == r)
58         return;
59     int mid = (l + r) >> 1;
60     msort(b, l, mid);
61     msort(b, mid + 1, r);
62     merge(b, l, r);
63 }
64 
65 int main()
66 {
67     freopen("MatchNOIP2013.in", "r", stdin);
68     freopen("MatchNOIP2013.out", "w", stdout);
69     cin >> n;
70     for (int i = 0; i < n; i++)
71     {
72         cin >> s[i].length;
73         s[i].id = i;
74     }
75     for (int i = 0; i < n; i++)
76     {
77         cin >> d[i].length;
78         d[i].id = i;
79     }
80     sort(s, s + n);
81     sort(d, d + n);//排序后方便将id离散化
82     for (int i = 0; i < n; i++)
83     {
84         a[s[i].id] = d[i].id;
85     }
86     msort(a, 0, n - 1);
87     cout << sum % 99999997 << endl;
88     return 0;
89 }

 

おすすめ

転載: www.cnblogs.com/kxxy/p/11772780.html