【归并排序】【逆序对】序列

来源:互联网 发布:java上传ftp速度慢 编辑:程序博客网 时间:2024/05/18 02:26
【题目描述】
    生活中,大多数事物都是有序的,因为顺序的美是最令人陶醉的。所以现在RCDH看了不顺的东西就头痛。所以他想让世界变成有序,所以现在RCDH看了不顺的东西就头痛。所以他想让世界变成有序,可是他只是一个无名小辈,所以只好对数字序列下手。据他所知序列的混乱程度是由“逆序对”的个数决定,公式是Q=2^n,其中Q是指混乱程度,n是指这个序列“逆序对”的个数。逆序对是这样定义的:假设序列中第I个数是ai,若存在Iaj,则就为一个逆序对。你的任务是给定一个序列,计算其混乱程度Q。这个数可能会比较大,你只需输出Qmod1991 的结果。
【输入格式】
    第一行,整数n,表示序列中有n个数。 
    第二行,有n个数。 
    对于30%的数据
    2=
    对于100%的数据 
    2=
    数列中的每个数不超过10000000的正整数。 
【输出格式】
    仅一行,Qmod1991 的值。
【输入样例】
4
1 3 4 2
【输出样例】
4
 

    这个,求逆序对的裸题。

分治法 先划分区间 分别求解 最后合并答案

最后求2^K没有使用快速幂的意义

由于要求Q mod C

C为1991 是一个定值

完全可以找出2^K mod C的循环 打一个小小的表……

代码如下

#include <cstdio>#include <algorithm>#include <cstdlib>#include <cstring>#include <cmath>using namespace std;int cnt;int N;int A[50005];int T[50005];const int ANS[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 57, 114, 228, 456, 912, 1824, 1657, 1323, 655, 1310, 629, 1258, 525, 1050, 109, 218, 436, 872, 1744, 1497, 1003, 15, 30, 60, 120, 240, 480, 960, 1920, 1849, 1707, 1423, 855, 1710, 1429, 867, 1734, 1477, 963, 1926, 1861, 1731, 1471, 951, 1902, 1813, 1635, 1279, 567, 1134, 277, 554, 1108, 225, 450, 900, 1800, 1609, 1227, 463, 926, 1852, 1713, 1435, 879, 1758, 1525, 1059, 127, 254, 508, 1016, 41, 82, 164, 328, 656, 1312, 633, 1266, 541, 1082, 173, 346, 692, 1384, 777, 1554, 1117, 243, 486, 972, 1944, 1897, 1803, 1615, 1239, 487, 974, 1948, 1905, 1819, 1647, 1303, 615, 1230, 469, 938, 1876, 1761, 1531, 1071, 151, 302, 604, 1208, 425, 850, 1700, 1409, 827, 1654, 1317, 643, 1286, 581, 1162, 333, 666, 1332, 673, 1346, 701, 1402, 813, 1626, 1261, 531, 1062, 133, 266, 532, 1064, 137, 274, 548, 1096, 201, 402, 804, 1608, 1225, 459, 918, 1836, 1681, 1371, 751, 1502, 1013, 35, 70, 140, 280, 560, 1120, 249, 498, 996};void init_file(){freopen("Sequence.in", "r", stdin);freopen("Sequence.out", "w", stdout);}void merge_sort(int * A, int x, int y,int *T){if (y - x > 1){int mid = x + (y - x) / 2;int p = x;int q = mid;int i = x;merge_sort(A, x, mid, T);merge_sort(A, mid, y, T);while(p < mid || q < y){if (q >= y || (p < mid && A[p] <= A[q])) T[i++] = A[p++];else{T[i++] = A[q++];cnt += (mid - p);}}for(int i = x; i < y; i++){A[i] = T[i];}}}void read_data(){scanf("%d", &N);for(int i = 0; i < N; i++)scanf("%d", A + i);}void work(){merge_sort(A, 0, N, T);printf("%d", ANS[cnt % 180]);}int main(){init_file();read_data();work();return 0;}


原创粉丝点击