思路:和POJ1990差不多,就是编号和排序变了一下。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
#define LL long long
const int maxn=100005;
LL c[2][maxn];
int n;
struct node
{
int v,x;
} a[maxn];
struct node1
{
int x,v,id;
} b[maxn];
void add(int x,int id,int val)
{
while(x<=maxn)
{
c[id][x]+=val;
x+=(x&-x);
}
}
LL sum(int x,int id)
{
LL s=0;
while(x>0)
{
s+=c[id][x];
x-=(x&-x);
}
return s;
}
bool cmp1(node1 a,node1 b)
{
return a.x<b.x;
}
bool cmp2(node1 a,node1 b)
{
return a.v<b.v;
}
bool cmp(node a,node b)
{
return a.v>b.v;
}
int main()
{
LL lescnt,lessum,bigcnt,bigsum,sumx;
int i;
while(~scanf("%d",&n))
{
memset(c,0,sizeof(c));
LL ans=0;
for(i=1; i<=n; ++i)
{
scanf("%d%d",&a[i].x,&a[i].v);
b[i].x=a[i].x,b[i].v=a[i].v,b[i].id=i;
}
sort(b+1,b+1+n,cmp1);
for(i=1; i<=n; ++i)
if(i>1&&b[i].x==b[i-1].x) a[b[i].id].x=a[b[i-1].id].x;
else a[b[i].id].x=i;
sort(b+1,b+1+n,cmp2);
for(i=1; i<=n; ++i)
if(i>1&&b[i].v==b[i-1].v) a[b[i].id].v=a[b[i-1].id].v;
else a[b[i].id].v=i;
sort(a+1,a+1+n,cmp);
add(a[1].x,0,1);
add(a[1].x,1,a[1].x);
sumx=a[1].x;
for(i=2; i<=n; ++i)
{
lescnt=sum(a[i].x-1,0);
lessum=sum(a[i].x-1,1);
bigcnt=i-1-sum(a[i].x,0);
bigsum=sumx-sum(a[i].x,1);
ans=ans+a[i].v*(lescnt*a[i].x-lessum+bigsum-bigcnt*a[i].x);
add(a[i].x,0,1);
add(a[i].x,1,a[i].x);
sumx+=a[i].x;
}
printf("%I64d\n",ans);
}
return 0;
}