hdoj 4911 Inversion 树状数组+离散化
来源:互联网 发布:linux查看软件版本 编辑:程序博客网 时间:2024/05/22 15:38
题意:给你n个可以重复的无序数列,问经过k次相邻交换后最少还有多少对逆序数
求逆序对可以用树状数组来做,对于重复的元素,可能在sort的时候交换编号
求和的时候要注意去重,还有一种方法就是稳定排序stable_sort
#include<string.h>#include<stdio.h>#include<algorithm>using namespace std;#define ll __int64#define N 100000+10struct ln{ int id,va;}in[N];int a[N],c[N];int n;int cmp(ln x,ln y){ return x.va<y.va;}int lowbit(int x) { return x&(-x);}void updata(int t,int value){ for(int i=t;i<=n;i+=lowbit(i)) c[i]+=value;}int getSum(int x){ int temp=0; for(int i=x;i>=1;i-=lowbit(i)) temp+=c[i]; return temp;}int main(){ int k; while(scanf("%d%d",&n,&k)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d",&in[i].va); in[i].id=i; } memset(c,0,sizeof(c)); sort(in+1,in+n+1,cmp); a[in[1].id]=1; for(int i=2;i<=n;i++) { if(in[i].va!=in[i-1].va) a[in[i].id]=i; else a[in[i].id]=a[in[i-1].id]; } ll ans=0; for(int i=1;i<=n;i++) { updata(a[i],1); printf("%d %d\n",getSum(a[i]),getSum(a[i]-1)); int temp=i-getSum(a[i]-1); temp=temp-(getSum(a[i])-getSum(a[i]-1)); ans+=temp; } if(ans-k<0) printf("0\n"); else printf("%I64d\n",ans-k); } return 0;}
#include<string.h>#include<stdio.h>#include<algorithm>using namespace std;#define ll __int64#define N 100000+10struct ln{ int id,va;}in[N];int a[N],c[N];int n;int cmp(ln x,ln y){ return x.va<y.va;}int lowbit(int x) { return x&(-x);}void updata(int t,int value){ for(int i=t;i<=n;i+=lowbit(i)) c[i]+=value;}int getSum(int x){ int temp=0; for(int i=x;i>=1;i-=lowbit(i)) temp+=c[i]; return temp;}int main(){ int k; while(scanf("%d%d",&n,&k)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d",&in[i].va); in[i].id=i; } memset(c,0,sizeof(c)); stable_sort(in+1,in+n+1,cmp); for(int i=1;i<=n;i++) a[in[i].id]=i; ll ans=0; for(int i=1;i<=n;i++) { updata(a[i],1); int temp=i-getSum(a[i]); ans+=temp; } if(ans-k<0) printf("0\n"); else printf("%I64d\n",ans-k); } return 0;}
0 0
- hdoj 4911 Inversion 树状数组+离散化
- hdu - 4911 - Inversion(离散化+树状数组)
- 【树状数组】hdu 4911 Inversion(离散化+树状数组求逆序数)
- HDOJ 5178 - pairs 离散化+树状数组..
- ACM 逆序对 hdu 4911 Inversion 离散化 树状数组模板
- HDU 4911 Inversion(树状数组求逆序对数 + 数据离散化)
- 【树状数组】 HDOJ 1394 Minimum Inversion Number
- hdoj 4358 树的线性化,树状数组,离散化
- HDOJ 4325 —— 树状数组 + 离散化
- HDOJ 5372 Segment Game 树状数组+离散化
- HDOJ 4456 Crowd 离散化+二维树状数组
- hdoj 3450 Counting Sequences 【离散化 + 树状数组优化dp】
- 树状数组--离散化
- 【2014 Multi-University Training Contest 5】 Inversion (离散化,树状数组求逆序数)
- HDU 1394 Minimum Inversion Number (离散化 + 树状数组 求逆序对)
- hdoj 5497 Inversion 【树状数组维护 区间逆序对】
- HDOJ 5497 Inversion(两个树状数组)(待解决)
- hdoj 1394 Minimum Inversion Number 线段树||树状数组||分治
- mysql 提取某字段内容插入到某个字段
- 【LeetCode刷题记录】Rotate Array
- 深入理解 scrollTo()、scrollBy()、getScrollX()
- 2014百度校招笔试题之动态链接库&静态链接库详解
- Mac 安装 Crypto.Cipher 模块
- hdoj 4911 Inversion 树状数组+离散化
- christian louboutin paris "Criminal Law" also provides the indecent assault of women and child mole
- 新浪微博(第六天)
- 2416 启动文件
- 字符之谜
- Linux启动过程
- 黑马程序员--java基本数据类型的比较和应用
- 用联合确定计算机的字节顺序
- Key记录