Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 6968 | Accepted: 3132 |
Description
Each cow i has an associated "hearing" threshold v(i) (in the range 1..20,000). If a cow moos to cow i, she must use a volume of at least v(i) times the distance between the two cows in order to be heard by cow i. If two cows i and j wish to converse, they must speak at a volume level equal to the distance between them times max(v(i),v(j)).
Suppose each of the N cows is standing in a straight line (each cow at some unique x coordinate in the range 1..20,000), and every pair of cows is carrying on a conversation using the smallest possible volume.
Compute the sum of all the volumes produced by all N(N-1)/2 pairs of mooing cows.
Input
* Lines 2..N+1: Two integers: the volume threshold and x coordinate for a cow. Line 2 represents the first cow; line 3 represents the second cow; and so on. No two cows will stand at the same location.
Output
Sample Input
4 3 1 2 5 2 6 4 3
Sample Output
57
这题的技巧性很强,n2算法肯定超时,关键在于怎么优化,当遇到求和问题时一定要对几个算法敏感RMQ,线段树,BIT;
因为要判断大小很容易想暴力,,但是也恰恰是要判断大小 可以从这点切入;
如果没有对BIT有一定感悟是构造不出这个结构的,,,,,
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 21000;
typedef long long LL;
int a[N], b[N];
struct node
{
int x, v;
}p[N];
int cmp(node A,node B)
{
return A.v<=B.v;
}
int lowbit(int k)
{
return k&-k;
}
void add(int s,int v, int *d)
{
while(s<=N)
{
d[s]+=v;
s+=lowbit(s);
}
return ;
}
LL sum(int s,int *d)
{
int ans=0;
while(s>0)
{
ans+=d[s];
s-=lowbit(s);
}
return ans;
}
int main()
{
int n;
while(scanf("%d", &n)!=EOF)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
{
scanf("%d %d", &p[i].v, &p[i].x);
}
sort(p+1,p+n+1,cmp);
LL ans=0, all=0;
for(int i=1;i<=n;i++)
{
LL num=sum(p[i].x,b);
LL dist=sum(p[i].x,a);
ans+=p[i].v*(num*p[i].x-dist+(all-dist)-(i-num-1)*p[i].x);
add(p[i].x,p[i].x,a);
add(p[i].x,1,b);
all+=p[i].x;
}
printf("%lld\n",ans);
}
return 0;
}