hrbust oj 1526+2028 树状数组
Posted 天翎月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hrbust oj 1526+2028 树状数组相关的知识,希望对你有一定的参考价值。
冒泡排序中 如果一个数的后面的某个数和这个数不符合排序规则 那么这个数就会在未来的某次冒泡中与那个数进行交换
这里用到了 树状数组求逆序数的办法来做 需要注意的是2028并不可以改完数组大小后直接套1526代码 因为会超出int的范围
树状数组求逆序对的耗时要比归并排序长一些 不过简单..
之所以要记录下来这道题是因为在其中并没有说 每一个数都是独一无二的 那么当我们离散化的时候就需要做出一些小的调整
1526
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> #include<iostream> #include<stack> #include<vector> using namespace std; int c[5050]; int n; struct node { int id; int val; }; node a[5050]; int cmp1(node a,node b) { return a.val<b.val; } int cmp2(node a,node b) { return a.id<b.id; } void lsh(){ sort(a+1,a+1+n,cmp1); a[0].val=0; for(int i=1;i<=n;i++) { int j=i; while(a[j].val==a[i].val&&j<=n) { j++; } for(int k=i;k<j;k++) { a[k].val=i; } i=j-1; } sort(a+1,a+1+n,cmp2); } int lowbit(int i) { return i&(-i); } void add(int x) { for(int i=x;i<=n;i+=lowbit(i)) { c[i]+=1; } } int sum(int x) { int s=0; for(int i=x;i>=1;i-=lowbit(i)) { s+=c[i]; } return s; } int main(){ while(cin>>n) { for(int i=1;i<=n;i++) { a[i].id=i; cin>>a[i].val; } lsh(); memset(c,0,sizeof(c)); int ans=0; for(int i=n;i>=1;i--) { int z=sum(a[i].val-1); ans+=z; add(a[i].val); } if(ans>1000000) printf("xiaohouTLE!\n"); else { printf("xiaohouV5!\n"); } } }
2028
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> #include<iostream> #include<stack> #include<vector> using namespace std; long long c[500050]; long long n; struct node { long long id; long long val; }; node a[500050]; long long cmp1(node a,node b) { return a.val<b.val; } long long cmp2(node a,node b) { return a.id<b.id; } void lsh(){ sort(a+1,a+1+n,cmp1); a[0].val=0; for(long long i=1;i<=n;i++) { long long j=i; while(a[j].val==a[i].val&&j<=n) { j++; } for(long long k=i;k<j;k++) { a[k].val=i; } i=j-1; } sort(a+1,a+1+n,cmp2); } long long lowbit(long long i) { return i&(-i); } void add(long long x) { for(long long i=x;i<=n;i+=lowbit(i)) { c[i]+=1; } } long long sum(long long x) { long long s=0; for(long long i=x;i>=1;i-=lowbit(i)) { s+=c[i]; } return s; } int main(){ while(cin>>n) { if(!n) break; for(long long i=1;i<=n;i++) { a[i].id=i; cin>>a[i].val; } lsh(); memset(c,0,sizeof(c)); long long ans=0; for(long long i=n;i>=1;i--) { long long z=sum(a[i].val-1); ans+=z; add(a[i].val); } cout<<ans<<endl; } }
以上是关于hrbust oj 1526+2028 树状数组的主要内容,如果未能解决你的问题,请参考以下文章
uestc oj 1217 The Battle of Chibi (dp + 离散化 + 树状数组)
玲珑学院OJ 1023 - Magic boy Bi Luo with his excited math problem 树状数组暴力
Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains 树状数组维护区间最大值(示(代