标签:des style blog http color os strong io
Description
Input
Output
Sample Input
4 3 1 2 5 2 6 4 3
Sample Output
57
x,y
对x按升序,y按升序排序之后
所以要求所有的费用,只需要考虑当前的cow和它前面每头cow的费用
要用到三个树状树状
一个是记录当前cow前面有多少头cow的位置比它的位子小
一个是记录当前cow前面所有位置比它的位子小的总价值
一个是记录当前cow前面所有位置比它的位置大的总价值
1 #include<iostream> 2 #include<string> 3 #include<cstdio> 4 #include<vector> 5 #include<queue> 6 #include<stack> 7 #include<algorithm> 8 #include<cstring> 9 #include<stdlib.h> 10 #include<string> 11 #include<cmath> 12 using namespace std; 13 #define pb push_back 14 int n; 15 __int64 p[20100],q[20100],qq[20100]; 16 struct node{ 17 int v,x; 18 }so[20100]; 19 int cmp(node a,node b){ 20 if(a.v==b.v) return a.x<b.x; 21 return a.v<b.v; 22 } 23 void update1(int pos,int num){ 24 while(pos<=20000){ 25 p[pos]+=num; 26 pos+=pos&(-pos); 27 } 28 } 29 __int64 getnum1(int pos){ 30 __int64 sum=0; 31 while(pos>=1){ 32 sum+=p[pos]; 33 pos-=pos&(-pos); 34 } 35 return sum; 36 } 37 void update2(int pos,int num){ 38 while(pos<=20000){ 39 q[pos]+=num; 40 pos+=pos&(-pos); 41 } 42 } 43 __int64 getnum2(int pos){ 44 __int64 sum=0; 45 while(pos>=1){ 46 sum+=q[pos]; 47 pos-=pos&(-pos); 48 } 49 return sum; 50 } 51 void update3(int pos,int num){ 52 while(pos>=1){ 53 qq[pos]+=num; 54 pos-=pos&(-pos); 55 } 56 } 57 __int64 getnum3(int pos){ 58 __int64 sum=0; 59 while(pos<=20000){ 60 sum+=qq[pos]; 61 pos+=pos&(-pos); 62 } 63 return sum; 64 } 65 int main(){ 66 while(cin>>n){ 67 memset(p,0,sizeof(p)); 68 memset(q,0,sizeof(q)); 69 for(int i=1;i<=n;i++) 70 scanf("%d%d",&so[i].v,&so[i].x); 71 sort(so+1,so+1+n,cmp); 72 __int64 sum=0; 73 for(int i=1;i<=n;i++){ 74 __int64 a,b,c; 75 a=getnum1(so[i].x);//位置比当前位置小的cow的数量 76 b=getnum2(so[i].x);//位置比当前位置小的总价值 77 c=getnum3(so[i].x);//位置比当前位置大的总价值 78 sum+=(a*so[i].x-b+c-(i-1-a)*so[i].x)*so[i].v; 79 update1(so[i].x,1); 80 update2(so[i].x,so[i].x); 81 update3(so[i].x,so[i].x); 82 } 83 printf("%I64d\n",sum); 84 } 85 }
poj 1990 mooFest,布布扣,bubuko.com
标签:des style blog http color os strong io
原文地址:http://www.cnblogs.com/ainixu1314/p/3888946.html