http://poj.org/problem?id=1990
這題調試了n久!!!就是因為變數名有點亂,自己也亂了。
#include <iostream><br />#include <cstring><br />#include <cstdio><br />#include <algorithm><br />using namespace std;<br />int num_small[20010],sum_small[20010];</p><p>int Max;<br />struct node<br />{<br /> int val,pos;<br />}a[20010];</p><p>void update(int i,int num,int *c)<br />{<br /> while(i<=Max)<br /> {<br /> c[i]+=num;<br /> i+=i&(-i);<br /> }<br />}</p><p>__int64 sum(int i,int *c)<br />{<br /> __int64 ans=0;<br /> while(i>0)<br /> {<br /> ans+=c[i];<br /> i-=i&(-i);<br /> }<br /> return ans;<br />}</p><p>bool cmp(node a,node b)<br />{<br /> return a.val<b.val;<br />}</p><p>int main()<br />{<br /> int n;<br /> scanf("%d",&n);<br /> int i;<br /> Max=0;<br /> for(i=1;i<=n;i++)<br /> {<br /> int x,y;<br /> scanf("%d%d",&a[i].val,&a[i].pos);<br /> if(a[i].pos>Max)<br /> Max=a[i].pos;<br /> }<br /> sort(a+1,a+n+1,cmp);<br /> memset(num_small,0,sizeof(num_small));<br /> memset(sum_small,0,sizeof(sum_small));<br /> __int64 ans=0;<br /> __int64 sum_x=a[1].pos;//a[i]前面所有數總和<br /> update(a[1].pos,1,num_small);<br /> update(a[1].pos,a[1].pos,sum_small);<br /> __int64 num_min,sum_min;<br /> for(i=2;i<=n;i++)<br /> {<br /> num_min=sum(a[i].pos,num_small);//a[i]前面比a[i]小的數的個數<br /> sum_min=sum(a[i].pos,sum_small);//a[i]前面比a[i]小的數的和<br /> ans+=a[i].val*(num_min*a[i].pos-sum_min+sum_x-sum_min-(i-num_min-1)*a[i].pos);<br /> update(a[i].pos,1,num_small);<br /> update(a[i].pos,a[i].pos,sum_small);<br /> sum_x+=a[i].pos;<br /> }<br /> printf("%I64d/n",ans);<br /> return 0;<br />}<br />