借鉴cxlove大神的思路
题意:听力v,位置x,2个牛交流声音为max(v1,v2)*(x1-x2),求总的
10000^2 tle
用的树状数组做的,排序,2个,小于vi的牛的总数和距离总和
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define maxn 20005 int arr[maxn],s[maxn]; //pair<int , int> cow[MAXN]; 类似结构体 struct tree { int x,v; }a[maxn]; int cmp(tree a,tree b) { return a.v<b.v; } int lowbit(int x) { return x&-x; } void update(int *a,int x,int val) { while(x<maxn) { a[x]+=val; x+=lowbit(x); } } int getsum(int *a,int x) { int sum=0; while(x>0) { sum+=a[x]; x-=lowbit(x); } return sum; } int main() { int n,i,j; while(scanf("%d",&n)!=EOF) { memset(arr,0,sizeof(arr)); memset(s,0,sizeof(s)); for(i=0;i<n;i++) scanf("%d%d",&a[i].v,&a[i].x); __int64 ans=0,total=0; sort(a,a+n,cmp); for(i=0;i<n;i++Q){ update(arr,a[i].x,1); update(s,a[i].x,a[i].x); total+=a[i].x; __int64 s_num=getsum(arr,a[i].x); __int64 s_x=getsum(s,a[i].x); ans+=a[i].v*(s_num*a[i].x-s_x+total-s_x-(i+1-s_num)*a[i].x); } printf("%I64d\n",ans); } return 0; }