此题和poj1990一样的思路,排序三次,之后的套上就行,一开始没用long long 导致wa了7 8次不开心
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<cstring>
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
const int MAX=1e5+20;
typedef struct
{
int r,h,id;
}P;
P p[MAX],no[MAX];
long long sum[MAX],c[MAX],n,d[MAX];
bool cmp1(const P&a,const P&b)
{
return a.r<b.r;
}
bool cmp2(const P&a,const P&b)
{
return a.h<b.h;
}
bool cmp3(const P&a,const P&b)
{
return a.h>b.h;
}
void add1(int n,int x)
{
while(n<=MAX)
{
c[n]+=x;
n+=n&(-n);
}
}
long long get_sum1(int n)
{
long long s=0;
while(n>0)
{
s+=c[n];
n-=n&(-n);
}
return s;
}
void add2(int n,int x)
{
while(n<=MAX)
{
d[n]+=x;
n+=n&(-n);
}
}
long long get_sum2(int n)
{
long long s=0;
while(n>0)
{
s+=d[n];
n-=n&(-n);
}
return s;
}
int main()
{
int i,j;
long long s;
while(scanf("%d",&n)!=EOF)
{
s=0;
mem(c);
mem(d);
mem(sum);
for(i=1;i<=n;i++)
scanf("%d%d",&p[i].r,&p[i].h),p[i].id=i;
sort(p+1,p+1+n,cmp1);
for(i=1;i<=n;i++)
if(p[i].r==p[i-1].r)
no[p[i].id].r=no[p[i-1].id].r;
else
no[p[i].id].r=i;
sort(p+1,p+1+n,cmp2);
for(i=1;i<=n;i++)
if(p[i].h==p[i-1].h)
no[p[i].id].h=no[p[i-1].id].h;
else
no[p[i].id].h=i;
sort(no+1,no+1+n,cmp3);
for(i=1;i<=n;i++)
sum[i]=sum[i-1]+no[i].r;
for(i=1;i<=n;i++)
{
long long lownum=get_sum1(no[i].r),bignum=i-1-lownum;
long long lowsum=get_sum2(no[i].r),bigsum=sum[i-1]-lowsum;
s+=(no[i].r*lownum-lowsum+bigsum-no[i].r*bignum)*no[i].h;
add1(no[i].r,1);
add2(no[i].r,no[i].r);
}
cout<<s<<endl;
}
return 0;
}