标签:des style blog class code java
Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 663 Accepted
Submission(s): 307
1 //203MS 4548K 1948 B C++ 2 /* 3 题意: 4 给出n个树的位置和高度,求每两棵数的位置排名差绝对值与高度排名较小的的积的和。 5 6 离散化+树状数组: 7 不错的一道题,我卡在结果的计算,的确对树状数组计算的能力的理解不够! 8 用两个排序排出位置和高度的排名,然后再对高度排名在进行计算,计算公式: 9 ans+=p[i].hid*(cnt*p[i].xid-sum+tsum-sum-(i-cnt-1)*p[i].xid); //每个高度 10 算法时间复杂度为O(n*lgn) 11 12 */ 13 #include<stdio.h> 14 #include<string.h> 15 #include<stdlib.h> 16 #define N 100005 17 struct node{ 18 int x,h; 19 int xid,hid; 20 int id; 21 }p[N],p1[N],p2[N]; 22 __int64 cnum[N],clen[N]; 23 int cmpx(const void *a,const void*b) 24 { 25 return (*(node*)a).x-(*(node*)b).x; 26 } 27 int cmph(const void*a,const void*b) 28 { 29 return (*(node*)a).h-(*(node*)b).h; 30 } 31 int cmp0(const void*a,const void*b) 32 { 33 return (*(node*)b).hid-(*(node*)a).hid; 34 } 35 int lowbit(int k) 36 { 37 return (-k)&k; 38 } 39 void update(__int64 c[],int k,int detal) 40 { 41 for(;k<N;k+=lowbit(k)) 42 c[k]+=detal; 43 } 44 __int64 getsum(__int64 c[],int k) 45 { 46 __int64 s=0; 47 for(;k>0;k-=lowbit(k)) 48 s+=c[k]; 49 return s; 50 } 51 int main(void) 52 { 53 int n,x,h; 54 while(scanf("%d",&n)!=EOF) 55 { 56 memset(cnum,0,sizeof(cnum)); 57 memset(clen,0,sizeof(clen)); 58 for(int i=1;i<=n;i++){ 59 scanf("%d%d",&p[i].x,&p[i].h); 60 p[i].id=i; 61 p1[i]=p2[i]=p[i]; 62 } 63 qsort(p1+1,n,sizeof(p1[0]),cmpx); 64 for(int i=1,j=1;i<=n;i++){ 65 if(i>1 && p1[i].x!=p1[i-1].x) j=i; 66 p[p1[i].id].xid=j; 67 } 68 qsort(p2+1,n,sizeof(p2[0]),cmph); 69 for(int i=1,j=1;i<=n;i++){ 70 if(i>1 && p2[i].h!=p2[i-1].h) j=i; 71 p[p2[i].id].hid=j; 72 } 73 qsort(p+1,n,sizeof(p[0]),cmp0); 74 __int64 ans=0; 75 //for(int i=1;i<=n;i++) printf("*%d %d\n",p[i].hid,p[i].xid); 76 update(cnum,p[1].xid,1); 77 update(clen,p[1].xid,p[1].xid); 78 for(int i=2;i<=n;i++){ 79 __int64 cnt=getsum(cnum,p[i].xid); 80 __int64 sum=getsum(clen,p[i].xid); 81 __int64 tsum=getsum(clen,N-1); 82 ans+=p[i].hid*(cnt*p[i].xid-sum+tsum-sum-(i-cnt-1)*p[i].xid); 83 update(cnum,p[i].xid,1); 84 update(clen,p[i].xid,p[i].xid); 85 } 86 printf("%I64d\n",ans); 87 } 88 return 0; 89 }
hdu 3015 Disharmony Trees (离散化+树状数组),布布扣,bubuko.com
hdu 3015 Disharmony Trees (离散化+树状数组)
标签:des style blog class code java
原文地址:http://www.cnblogs.com/GO-NO-1/p/3707853.html