hdu1349(题解) Minimum Inversion Number
来源:互联网 发布:定时短信软件 编辑:程序博客网 时间:2024/04/28 12:52
先用线段树求出最初的逆序数(O(nlogn)),然后推其他(O(n))
设a1,a2,……an的逆序数为sum,an的逆序数为invn,则an,a1,……an-1的逆序数=sum-invn+比an小的数,而由于输入的数是0,1,……,n-1
所以比an小的数==an,而且invn=n-1-an;所以an,a1,……an-1的逆序数=sum+2*an-n+1,下面代码是反过来,道理是一样的
#include <stdio.h>#include <string.h>#define Minn(X,Y) (((X)<(Y))?(X):(Y))int tree[5050<<2],sum,n,xx[5005];void buildt(int tn,int l,int r,int x){ int mid; if(l==r) {tree[tn]=1;return; }//tree[tn]=1是因为n个数都不相等 mid=((r-l)>>1)+l; if(x<=mid) {sum+=tree[tn<<1|1];buildt(tn<<1,l,mid,x);} else buildt(tn<<1|1,mid+1,r,x); tree[tn]=tree[tn<<1]+tree[tn<<1|1];}int main(int argc, char const *argv[]){ int i,res; while(scanf("%d",&n)!=EOF) { memset(tree,0,sizeof(tree)); sum=0; for(i=0;i<n;i++){ scanf("%d",xx+i); buildt(1,0,n-1,xx[i]); } res=sum; for(i=0;i<n-1;i++){ sum+=n-1-2*xx[i]; res=Minn(res,sum); } printf("%d\n",res ); } return 0;}
0 0
- hdu1349(题解) Minimum Inversion Number
- HDU1349 Minimum Inversion Number
- HDUOJ Minimum Inversion Number
- hdu1394 Minimum Inversion Number
- hdu1394 Minimum Inversion Number
- hdu1394 Minimum Inversion Number
- Minimum Inversion Number
- HDU1394:Minimum Inversion Number
- HDU1394:Minimum Inversion Number
- HDU1394--Minimum Inversion Number
- Minimum Inversion Number HDU
- HDU Minimum Inversion Number
- Minimum Inversion Number
- Minimum Inversion Number
- Minimum Inversion Number
- hdu1394 Minimum Inversion Number
- hdu1394 Minimum Inversion Number
- hdu1394 Minimum Inversion Number
- CF Watchmen 【思维+数学】
- 自动化发布项目之jenkins + git + maven 自动化部署一个web项目
- linux下的进程控制块task_struct详解
- Android Studio详细使用教程
- HYSBZ 1036 树的统计Count(树链剖分)
- hdu1349(题解) Minimum Inversion Number
- 解决Git项目不能Pull
- 发牌算法(java)
- 二叉树的前序遍历,中序遍历,后序遍历代码
- C++常见面试题—内存管理GetMemory()
- 强悍的命令行 —— 命令提示符(command prompt)
- Sql Server - Linq , SQL时间相关 - SQL日期,时间比较
- 在sha1 keytool不是内部或外部命令 android studio
- C语言的.和->的区别