内你n个数 让你求区间倒置数的对数(就是前面大后面小) 看到Q次询问 想到线段树 感觉不好实现 !!
pre【i】 表示i前面与i有关的倒置数的个数 ans【i】【j】表示区间i-j倒置数的个数 这样就实现了O(1)查询 整体时间复杂度为O(n^2);
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int num[1100],ans[1010][1010],pre[1100]; int main() { int i,j,n,m; while(~scanf("%d%d",&n,&m)) { for(i=1;i<=n;i++) { scanf("%d",&num[i]); } memset(ans,0,sizeof(ans)); memset(pre,0,sizeof(pre)); for(i=1;i<=n;i++) { for(j=1;j<i;j++) { if(num[j]>num[i])pre[i]++; } } num[0]=0; for(i=0;i<n;i++) { for(j=i+1;j<=n;j++) { if(num[i]>num[j]) pre[j]-=1; ans[i+1][j]=ans[i+1][j-1]+pre[j]; } } int a,b; for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); printf("%d\n",ans[a][b]); } } return 0; }
时间: 2024-10-28 19:32:45