题目描述:……摸牛仔的屁股……。话说这不是LYF最喜欢的游戏吗?
考虑题目给出的公式,
max(Vi,Vj)∗|Xi−Xj|
,我们可以
V
作为关键字排序,消除
然后考虑绝对值,如果
但是!这个结论是非常有用的!接着往下看就知道了。
对于一头奶牛
i
,这头奶牛显然为当前所有计算过的奶牛中
显然上述的公式中的
于是这题就被愉快的A掉啦。
附上AC代码:
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
const int N=2e4+10;
struct note{
int v,x;
bool operator < (const note lyf) const {return v<lyf.v;}
}a[N];
int n,m,sum[N],num[N];
long long ans;
inline char nc(){
static char ch[100010],*p1=ch,*p2=ch;
return p1==p2&&(p2=(p1=ch)+fread(ch,1,100010,stdin),p1==p2)?EOF:*p1++;
}
inline void read(int &a){
static char c=nc();int f=1;
for (;!isdigit(c);c=nc()) if (c=='-') f=-1;
for (a=0;isdigit(c);a=a*10+c-'0',c=nc());
return (void)(a*=f);
}
#define lowbit(x) ((x)&(-x))
inline int query(int *t,int x){int sum=0; for (int i=x; i; i-=lowbit(i)) sum+=t[i]; return sum;}
inline void add(int *t,int x,int w){for (int i=x; i<=m; i+=lowbit(i)) t[i]+=w; return;}
int main(void){
read(n);
for (int i=1; i<=n; ++i) read(a[i].v),read(a[i].x),m=max(m,a[i].x);
sort(a+1,a+1+n);
for (int i=1; i<=n; ++i){
int numl=query(num,a[i].x-1);
int suml=query(sum,a[i].x-1);
int numr=query(num,m)-query(num,a[i].x);
int sumr=query(sum,m)-query(sum,a[i].x);
ans+=1ll*a[i].v*(sumr-a[i].x*numr+a[i].x*numl-suml);
add(num,a[i].x,1),add(sum,a[i].x,a[i].x);
}
return printf("%lld\n",ans),0;
}