题目链接:https://nanti.jisuanke.com/t/16443
我不会矩阵快速幂,所以只拿了60分,
发现归并排序掌握的并不熟练,借此良机复习一下。
重在归并排序分治思想,要牢记!
#include<iostream> #include<cstring> using namespace std; int n,m,a[30005],s[30005],ans,d[30005]; void msort(int l,int r) { if(l==r)return;//如果只有一个数字就返回,此处还可使L不会大于R,因为L=R的时候就返回了 int mid=(l+r)>>1; msort(l,mid); msort(mid+1,r); int i=l,j=mid+1,k=l; while(i<=mid&&j<=r){ if(d[i]<=d[j]){ s[k]=d[i];k++;i++; } else{ s[k]=d[j];k++;j++; ans+=mid-i+1; //ans求逆序对数量,左边的序列中从i到mid递增,所以从i到mid都是大于j的-----------注意 } } while(i<=mid){//没有进入数组的 与下面功能相同 s[k]=d[i];k++;i++; } while(j<=r){//漏掉的 s[k]=d[j];k++;j++; } for(int i=l;i<=r;i++)d[i]=s[i];//排一下序 } int main() { cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; cin>>m; while(m--){ int l,r; cin>>l>>r; for(int i=l;i<=r;i++)d[i]=a[i]; msort(l,r); cout<<ans<<endl; memset(s,0,sizeof(s)); memset(d,0,sizeof(d)); ans=0; } return 0; }
时间: 2024-10-22 23:23:31