HDU1394 Minimum Inversion Number 逆序数- 线段树单点更新求
来源:互联网 发布:传奇3物品数据库 编辑:程序博客网 时间:2024/05/22 06:09
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394
题目大意:给出一个长度为n的序列,序列中元素的值包含0到n-1,我们把第一个元素移到最后面,其他元素位置不变,得到一个新的序列,这样我们一个可以得到n个不同的序列,找出这n个序列中最小的逆序数。
分析:比HDU2689多了一步,我们在找出第一个序列的逆序数之后,如果把第一个元素a[0]移到最后面,那么这个新序列的逆序数会减少a[0]个(因为一共有a[0]个数小于a[0]),不过同时,会有n-1-a[0]个数大于a[0],所以逆序数又增加了n-1-a[0]个,加起来就是,对于每一次换换,新的逆序数ans=ans-a[0]+n-1-a[0]。这样我们遍历一遍原序列,就能找出最小的逆序数了。
实现代码如下:
#include <iostream>#include <cstdio>using namespace std;const int maxn=5005;struct segment{ int l,r; int num;}tree[maxn<<2];void build(int root,int l,int r){ tree[root].l=l; tree[root].r=r; tree[root].num=0; if(l==r) return ; int mid=(l+r)>>1; build(root<<1,l,mid); build(root<<1|1,mid+1,r);}void update(int root,int v){ if(tree[root].l==v&&tree[root].r==v) { tree[root].num=1; return ; } int mid=(tree[root].l+tree[root].r)>>1; if(v<=mid) update(root<<1,v); else update(root<<1|1,v); tree[root].num=tree[root<<1].num+tree[root<<1|1].num;}int query(int root,int l,int r){ if(l<=tree[root].l&&r>=tree[root].r) return tree[root].num; int mid=(tree[root].l+tree[root].r)>>1; int sum1=0,sum2=0; if(l<=mid) sum1=query(root<<1,l,r); if(r>mid) sum2=query(root<<1|1,l,r); return sum1+sum2;}int main(){ int n,a[maxn]; while(scanf("%d",&n)!=-1) { build(1,0,n-1); int ans=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); ans+=query(1,a[i]+1,n-1); update(1,a[i]); } int mini=ans; for(int i=0;i<n;i++) { ans=ans-a[i]+n-1-a[i]; if(ans<mini) mini=ans; } printf("%d\n",mini); } return 0;}
0 0
- HDU1394 Minimum Inversion Number 逆序数- 线段树单点更新求
- 【线段树求逆序数】【HDU1394】Minimum Inversion Number
- hdu1394 Minimum Inversion Number 线段树求逆序数
- hdu1394 -Minimum Inversion Number(线段树求逆序数)
- hdu1394 Minimum Inversion Number 最小逆序数 线段树单点更新区间查询
- HDU1394 Minimum Inversion Number(线段树单点更新,暴力,逆序数)
- Minimum Inversion Number(线段树单点更新+逆序数)
- HDU1394 Minimum Inversion Number 求逆序数
- hdu 1394 Minimum Inversion Number(线段树之 单点更新求逆序数)
- HDU 1394 Minimum Inversion Number (线段树 单点更新 求逆序数)
- HDU 1394 Minimum Inversion Number(线段树:单点更新,求逆序数)
- HDU 1394 Minimum Inversion Number 线段树 单点更新 求逆序数
- HDU1394 Minimum Inversion Number [暴力] [线段树-单点更新]
- HDU1394:Minimum Inversion Number(线段树单点更新)
- hdu1394 Minimum Inversion Number 线段树,单点更新
- hdu1394 Minimum Inversion Number(线段树单点更新||暴力)
- HDU1394-Minimum Inversion Number(线段树单点更新)
- 数据结构 线段树 hdu1394 Minimum Inversion Number(单点更新)
- caffe使用MemoryDataLayer从内存中加载数据
- VBA病毒“制造机”正在流行
- 深度学习-----数据预处理
- 8.3.5 Multiple-Column Indexes 多列索引
- Git Rebase教程: 用Git Rebase让时光倒流
- HDU1394 Minimum Inversion Number 逆序数- 线段树单点更新求
- ZXPxx头文件
- 好心酸,不知道怎么办好,没日没夜的做啊
- 摘要Myeclipse或Eclipse 老是出现JPA project Change Event Handler,导致需要执行的处理没有进行;关闭也关不完。
- 每天5道面试题(三)java基础
- <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 的说明
- BZOJ 1101([POI2007]Zap-满足x<=a&&y<=b&&gcd(x,y)=d的数对个数)
- Expect: send's 256 character limitation
- phpcms v9 外部链接在新窗口打开