您的位置:首页 > Web前端

【树状数组】 POJ 1990 MooFest

2014-06-19 19:59 337 查看
对v进行排序,再对x进行树状数组就行了,比较简单,不难。。。贴上本渣的代码。

#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <climits>
#define maxn 20005
#define eps 1e-7
#define mod 1000000007
#define INF 99999999
#define lowbit(x) (x&(-x))
typedef long long LL;
using namespace std;

LL tree[maxn], s[maxn], cnt[maxn];
LL n;
struct node
{
LL v, x;
}tmp[maxn];
int cmp(node a, node b)
{
return a.v<b.v;
}
void add_cnt(LL x)
{
for(int i=x;i<maxn;i+=lowbit(i)) cnt[i]+=1;
}
void add_tree(LL x)
{
for(int i=x;i<maxn;i+=lowbit(i)) tree[i]+=x;
}
int sum_tree(LL x)
{
LL ans=0;
for(int i=x;i>0;i-=lowbit(i)) ans+=tree[i];
return ans;
}
int sum_cnt(LL x)
{
LL ans=0;
for(int i=x;i>0;i-=lowbit(i)) ans+=cnt[i];
return ans;
}
LL _abs(LL x)
{
if(x<0) return -x;
else return x;
}
int main(void)
{
int i;
LL ans;
while(scanf("%lld",&n)!=EOF){
for(i=1;i<=n;i++) scanf("%lld%lld",&tmp[i].v,&tmp[i].x);
sort(tmp+1, tmp+n+1, cmp);
for(i=1;i<=n;i++) s[i]=s[i-1]+tmp[i].x;
memset(tree, 0, sizeof tree);
memset(cnt, 0, sizeof cnt);
ans=0;
for(i=1;i<=n;i++){
ans+=_abs(sum_cnt(tmp[i].x)*tmp[i].x-sum_tree(tmp[i].x))*tmp[i].v;
ans+=_abs((i-sum_cnt(tmp[i].x)-1)*tmp[i].x-(s[i-1]-sum_tree(tmp[i].x)))*tmp[i].v;
add_cnt(tmp[i].x);
add_tree(tmp[i].x);
}
printf("%lld\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: