南阳oj 求逆数 题目117
2015-09-07 20:36
162 查看
#include<stdio.h>
#define N 1000001
int a
,b
;
long long sum;
void gb(int be,int mi,int en)
{
int i=be,j=mi+1,pos=be;
while(i<=mi&&j<=en)
{
if(a[i]<=a[j]) b[pos++]=a[i++];
else
{
b[pos++]=a[j++];
sum+=mi-i+1;
}
}
while(i<=mi) b[pos++]=a[i++];
while(j<=en) b[pos++]=a[j++];
for(int i=be,j=be;i<=en;i++,j++)
a[i]=b[j];
}
void px(int be,int en)
{
if(be<en)
{
int mi=(be+en)/2;
px(be,mi);
px(mi+1,en);
gb(be,mi,en);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
sum=0;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
px(1,n);
printf("%lld\n",sum);
}
return 0;
}
#include<stdio.h>
#define N 1000001
int a
,b
;
long long sum;
void gb(int be,int mi,int en)
{
int i=be,j=mi+1,pos=be;
while(i<=mi&&j<=en)
{
if(a[i]<=a[j]) b[pos++]=a[i++];
else
{
b[pos++]=a[j++];
sum+=mi-i+1;
}
}
while(i<=mi) b[pos++]=a[i++];
while(j<=en) b[pos++]=a[j++];
for(int i=be,j=be;i<=en;i++,j++)
a[i]=b[j];
}
void px(int be,int en)
{
if(be<en)
{
int mi=(be+en)/2;
px(be,mi);
px(mi+1,en);
gb(be,mi,en);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
sum=0;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
px(1,n);
printf("%lld\n",sum);
}
return 0;
}
相关文章推荐
- 求两个字符串的最长公共子串的长度
- Linux&C ——信号以及信号处理
- JSON 解析
- 串口驱动程序
- iPhone第六节:代理模式
- [转]做技术的你,如果别人找你创业,该怎么办?
- Listary – Windows 文件浏览增强工具
- 河内塔(递归)
- 对数据库的增删
- JDBC简介
- 【转】Android BLE开发之Android手机与BLE终端通信
- iOS应用性能调优的25个建议和技巧
- 欢迎使用CSDN-markdown编辑器
- HDU 4998 Rotate 简单几何旋转问题
- Android获取状态栏高度
- 链表中倒数第k个结点(剑指offer)
- 前段开发简介
- Java面试题
- HDU1050 - Moving Tables (贪心)
- leetcode OJ1 Two Sum求解小结