Pagini recente » Cod sursa (job #2201403) | Cod sursa (job #1269216) | Cod sursa (job #3209924) | Cod sursa (job #2796965) | Cod sursa (job #2810941)
#include <bits/stdc++.h>
#define NMAX 10005
using namespace std;
/********************************/
/// INPUT / OUTPUT
ifstream f("litere.in");
ofstream g("litere.out");
/********************************/
/// GLOBAL DECLARATIONS
long long N, ans;
int temp[NMAX];
char ch;
vector <int> num;
/********************************/
/// FUNCTIONS
void ReadInput();
void Solution();
void Output();
/********************************/
///------------------------------------------
inline void ReadInput()
{
f >> N;
for (int i = 0 ; i < N ; ++ i)
{
f >> ch;
num.push_back(ch - 'a' + 1);
}
}
///------------------------------------------
long long Merge(int left, int mid, int right)
{
long long inversions = 0;
int nr = left;
int i = left, j = mid + 1;
while (i <= mid && j <= right)
{
if (num[i] <= num[j])
{
temp[nr ++] = num[i ++];
}
else
{
inversions += mid - i + 1;
temp[nr ++] = num[j ++];
}
}
while (i <= mid)
{
temp[nr ++] = num[i ++];
}
while (j <= right)
{
temp[nr ++] = num[j ++];
}
for (int i = left ; i <= right ; ++ i)
{
num[i] = temp[i];
}
return inversions;
}
///------------------------------------------
long long MergeSort(int left, int right)
{
long long inversions = 0;
if (left < right)
{
int mid = left + (right - left) / 2;
inversions = MergeSort(left, mid);
inversions += MergeSort(mid + 1, right);
inversions += Merge(left, mid, right);
}
return inversions;
}
///------------------------------------------
inline void Solution()
{
ans = MergeSort(0, N - 1);
}
///------------------------------------------
inline void Output()
{
g << ans;
}
///------------------------------------------
int main()
{
ReadInput();
Solution();
Output();
return 0;
}