一、题面

POJ1990

二、分析

  一个简单的树状数组运用。首先要把样例分析清楚,凑出57,理解一下。然后可以发现,如果每次取最大的v就可以肆无忌惮的直接去乘以坐标差值就可以了,写代码的时候是反着来的,好操作一点。

  1.根据每个点的v值进行从小到大的排序。

  2.排序后从小到大进行处理,重点是处理坐标的差值和。

  3.取出一个点后,先用树状数组(需要不断的加入点进行维护)算出坐标小于等于这个点的坐标和,记为$Sum$。

  4.算出坐标小于等于这个点的坐标的数量,记为$Count$。

  5.现在可以算出所有坐标小于等于该点的坐标差值之和(所有已经维护的点)。利用公式

$ansLeft = v * (Count * x - Sum)$

这个就是小于坐标x(即x坐标左边)的答案。

  6.还需要求出x右边的差值和,这里直接维护一个所有加入点的坐标和$total$,并且比较容易推出大于x坐标的点的数量为$i - Count$。需要注意的是这里的$i$是当前点的下标,那么就是除去当前点的所有已经加入点的数量。(可能说的不太清楚,可以画一画,体会一下)。

  7.推导出右边的和。

$ansRight = v * [total - Sum - (i - Count) * x]$

  8.更新答案

$ans = ansLeft + ansRight$

更新total

$total += x$

维护树状数组

然后回到3进行循环处理即可。

  9.得出最终答案$ans$。

三、AC代码

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm> using namespace std; const int MAXN = 2e4 + ;
typedef long long LL; struct Node
{
int x, v;
bool operator < (const Node & t)const
{
return v < t.v;
}
}Data[MAXN]; int countBIT[MAXN]; //统计个数 MAXN其实是坐标最大
int sumBIT[MAXN]; //统计坐标值
int N; int getSum(int x, int *arr) //BIT求和
{
int ans = ;
while(x)
{
ans += arr[x];
x -= x & (-x);
}
return ans;
} void add(int x, int val, int *arr) //单点更新
{
while(x < MAXN)
{
arr[x] += val;
x += x & (-x);
}
} LL solve()
{
LL ans = ;
LL total = ;
memset(countBIT, , sizeof(countBIT));
memset(sumBIT, , sizeof(sumBIT));
sort(Data, Data + N); //v值从小到大进行处理
for(int i = ; i < N; i++)
{
LL Count = getSum(Data[i].x, countBIT); //比坐标x小的数量
LL Sum = getSum(Data[i].x, sumBIT); //坐标<=x的坐标和 //+left
ans += Data[i].v * (Count * Data[i].x - Sum);
//+right
ans += Data[i].v * (total - Sum - (i - Count) * Data[i].x);
total += Data[i].x;
add(Data[i].x, , countBIT);
add(Data[i].x, Data[i].x, sumBIT);
}
return ans; } int main()
{ while(scanf("%d", &N) != EOF)
{
for(int i = ; i < N; i++)
{
scanf("%d %d", &Data[i].v, &Data[i].x);
}
printf("%lld\n", solve());
}
return ;
}

POJ_1990 MooFest 【树状数组】的更多相关文章

  1. POJ 1990 MooFest --树状数组

    题意:牛的听力为v,两头牛i,j之间交流,需要max(v[i],v[j])*dist(i,j)的音量.求所有两两头牛交谈时音量总和∑(max(v[i],v[j])*abs(x[j]-x[i])) ,x ...

  2. MooFest 树状数组 + 前缀和

    比较友好的数据结构题 建议读者好好思考思考--. 可以分析出与前缀和的关系, 之后就愉快的套起树状数组辣 #include <cstdio> #include<queue> # ...

  3. POJ 1990 MooFest(树状数组)

                                                                        MooFest Time Limit: 1000MS   Mem ...

  4. MooFest POJ - 1990 (树状数组)

    Every year, Farmer John's N (1 <= N <= 20,000) cows attend "MooFest",a social gather ...

  5. [bzoj3378][Usaco2004 Open]MooFest 狂欢节_树状数组

    MooFest 狂欢节 bzoj-3378 Usaco-2004 Open 题目大意:给定一个n个数的a序列,每两个数之间有一个距离,两个点之间的权值为$max(a[i],a[j])*dis(i,j) ...

  6. POJ1990--POJ 1990 MooFest(树状数组)

    Time Limit: 1000MSMemory Limit: 30000K Total Submissions: 8141Accepted: 3674 Description Every year, ...

  7. BZOJ3378:[USACO]MooFest 狂欢节(树状数组)

    Description 每一年,约翰的N(1≤N≤20000)只奶牛参加奶牛狂欢节.这是一个全世界奶牛都参加的大联欢.狂欢节包括很多有趣的活动,比如干草堆叠大赛.跳牛栏大赛,奶牛之间有时还相互扎屁股取 ...

  8. [BZOJ3378] [Usaco2004 Open]MooFest 狂欢节(树状数组)

    传送门 开2个树状数组 一个存的是下标,一个存的是数量 细节...看标称吧,懒得说了,好气啊 #include <cstdio> #include <iostream> #in ...

  9. {POJ}{树状数组}

    总结一下树状数组的题目: {POJ}{3928}{Ping Pong} 非常好的题目,要求寻找一个数组中满足A[i]<A[k]<A[j]的个数,其中i<k<j(或者相反).很巧 ...

随机推荐

  1. Spring.net 在aps.net Web的配置复习

    1.引入程序集Spring.Core,CommonLogging,Spring.Web 2.Web.Config的配置 <?xml version="1.0" encodin ...

  2. CentOS7.4配置SSH登录密码与密钥身份验证踩坑

    简单记录,自用CentOS7.4虚拟机与ALiYunVPS,在配置ssh登录身份验证时碰到的问题. 阿里云VPS:因为在重置磁盘时选择了密钥对的身份验证方式,因此VPS中的CentOS7.4中的 /e ...

  3. Java Persistence with MyBatis 3(中文版) 第一章 MyBatis入门

    本章将涵盖以下话题: ž  MyBatis是什么? ž  为什么选择MyBatis? ž  MyBatis安装配置 ž  域模型样例 1.1 MyBatis是什么 MyBatis是一个简化和实现了Ja ...

  4. 37 有n个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号那位.

    题目:有n个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号那位. public class _037NumberOff { public st ...

  5. javascript总结19:javascript 使用概述

    1 JS作用 1.验证表单(以前的网速慢)`` 2.页面特效(PC端的网页效果) 3.移动端(移动web和app) 4.异步和服务器交互(AJAX) 5.服务端开发(nodejs) 2 浏览器的主要构 ...

  6. 一、Numpy基础--数组

    (一)Numpy数组对象 Numpy中的nadrray是一个多维数组对象,该对象由两部分组成: 实际的数据 描述这些数据的元数据 大部分的数组操作仅仅修改元数据部分,而不改变底层的实际数据. 数组的数 ...

  7. 深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式

    内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的 ...

  8. Android-ContentProvider简单的增删改查

    注意:在ContentProvider里面写对数据库增删改查的时候,千万不能 db.close();  cursor.close(); 等操作,不然其他应用访问不到数据,也没有必要写isOpen(); ...

  9. python urllib2 对 http 的 get,put,post,delete

    #GET: #!/usr/bin/env python# -*- coding:utf-8 -*-import urllib2def get():    URL = 'www.baidu.com'   ...

  10. win7 下 vim字体默认设置

    set guifont=Consolas 在_vimrc开头第一行写上就行了