您的位置:首页 > 产品设计 > UI/UE

HDU 5273 Dylans loves sequence【 树状数组 】

2015-06-28 16:32 489 查看
题意:给出n个数,再给出q个询问,求L到R的逆序对的个数

先自己写的时候,是每次询问都重新插入来求sum(r)-sum(l)

果断T

后来还是看了别人的代码----

预处理一下,把所有可能的区间的询问都求出来(1000*1000), 然后询问就是O(1)了

然后想自己这样写超时,是因为询问太多了----

#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

typedef long long LL;
const int INF = (1<<30)-1;
const int mod=1000000007;
const int maxn=1005;

int a[maxn];
int c[maxn];//树状数组
int n,m;
int ans[maxn][maxn];

struct node{
int x,id;
}p[maxn];

int cmp(node n1,node n2){
return n1.x < n2.x;
}

int lowbit(int x){ return x &(-x);}

int sum(int x){
int ret=0;
while(x>0){
ret += c[x];x-=lowbit(x);
}
return ret;
}

void add(int x,int d){
while(x<=n){
c[x]+=d;x+=lowbit(x);
}
}

int main(){
while(scanf("%d %d",&n,&m) != EOF){
memset(c,0,sizeof(c));
memset(a,0,sizeof(a));
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++) {
scanf("%d",&p[i].x);
p[i].id=i;
}
sort(p+1,p+n+1,cmp);
for(int i=1,j=0;i<=n;i++){
if(i==1||p[i].x != p[i-1].x) j++;
a[p[i].id]=j;
}

//    for(int i=1;i<=n;i++)
//    printf("a[%d]=%d\n",i,a[i]);

for(int i=1;i<=n;i++){
memset(c,0,sizeof(c));
int res=0;
for(int j=i;j<=n;j++){
res+=(j-i)-sum(a[j]);
add(a[j],1);
ans[i][j] = res;
}
}

while(m--){
int l,r;
scanf("%d %d",&l,&r);
printf("%d\n",ans[l][r]);
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: