2 solutions
-
1
#include<bits/stdc++.h> using namespace std; int n,nex[15000005][2],cnt,siz[15000005]; long long ans; void insert(int s){ int p=0; for(int i=29;i>=0;i--){ int c=(s>>i)&1; if(c==0)ans+=siz[nex[p][1]]; if(!nex[p][c])nex[p][c]=++cnt; p=nex[p][c]; siz[p]++; } } signed main(){ cin>>n; for(int a,i=1;i<=n;i++){ cin>>a; insert(a); } cout<<ans; return 0; } -
1
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int q[N],temp[N]; typedef long long LL; LL merge_sort(int l,int r) { if(l>=r) return 0; int mid=l+r>>1; LL res=0; res+=merge_sort(l,mid); //左边的逆序对数目 res+=merge_sort(mid+1,r); //右边的逆序对数目 int i=l,j=mid+1; int idx=0; while(i<=mid&&j<=r) { if(q[i]<=q[j]) temp[idx++]=q[i++]; else { res+=mid-i+1;//加上q[j]和左边序列构成的逆序对数目 temp[idx++]=q[j++]; } } while(i<=mid) temp[idx++]=q[i++]; //左边还没有放完 while(j<=r) temp[idx++]=q[j++]; //右边还没有放完 for(int i=l,idx=0;i<=r;i++,idx++) //按照顺序放到原位置 { q[i]=temp[idx]; } return res; //返回l到r这段的逆序对数目 } int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>q[i]; } cout<<merge_sort(1,n); return 0; }
- 1
Information
- ID
- 328
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 30
- Accepted
- 11
- Uploaded By