POJ_1990 MooFest 【树状数组】
一、题面
二、分析
一个简单的树状数组运用。首先要把样例分析清楚,凑出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 【树状数组】的更多相关文章
- 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 ...
- MooFest 树状数组 + 前缀和
比较友好的数据结构题 建议读者好好思考思考--. 可以分析出与前缀和的关系, 之后就愉快的套起树状数组辣 #include <cstdio> #include<queue> # ...
- POJ 1990 MooFest(树状数组)
MooFest Time Limit: 1000MS Mem ...
- MooFest POJ - 1990 (树状数组)
Every year, Farmer John's N (1 <= N <= 20,000) cows attend "MooFest",a social gather ...
- [bzoj3378][Usaco2004 Open]MooFest 狂欢节_树状数组
MooFest 狂欢节 bzoj-3378 Usaco-2004 Open 题目大意:给定一个n个数的a序列,每两个数之间有一个距离,两个点之间的权值为$max(a[i],a[j])*dis(i,j) ...
- POJ1990--POJ 1990 MooFest(树状数组)
Time Limit: 1000MSMemory Limit: 30000K Total Submissions: 8141Accepted: 3674 Description Every year, ...
- BZOJ3378:[USACO]MooFest 狂欢节(树状数组)
Description 每一年,约翰的N(1≤N≤20000)只奶牛参加奶牛狂欢节.这是一个全世界奶牛都参加的大联欢.狂欢节包括很多有趣的活动,比如干草堆叠大赛.跳牛栏大赛,奶牛之间有时还相互扎屁股取 ...
- [BZOJ3378] [Usaco2004 Open]MooFest 狂欢节(树状数组)
传送门 开2个树状数组 一个存的是下标,一个存的是数量 细节...看标称吧,懒得说了,好气啊 #include <cstdio> #include <iostream> #in ...
- {POJ}{树状数组}
总结一下树状数组的题目: {POJ}{3928}{Ping Pong} 非常好的题目,要求寻找一个数组中满足A[i]<A[k]<A[j]的个数,其中i<k<j(或者相反).很巧 ...
随机推荐
- 比较C++、Java、Delphi声明类对象时候的相关语法
同学们在学习的时候经常会遇到一些问题,C++.Java.Delphi他们到底有什么不一样的呢?今天我们来比较C++.Java.Delphi声明类对象时候的相关语法.希望对大家有帮助! C++中创建对象 ...
- Siverlight MarkerSize 控制数据点半径大小 LineThickness 控制点与点之间直线的厚度
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...
- 3.3.5 高效读取:不变模式下的CopyOnWriteArrayList
源码分析:读写(get,add) 一:get 方法 private E get(Object[] a, int index) { return (E) a[index];}可以看到读取数据的时候 没有 ...
- CEPH集群RBD快照创建、恢复、删除、克隆(转)
Ceph支持一个非常好的特性,以COW(写时复制)的方式从RBD快照创建克隆,在Ceph中被称为快照分层.分层特性允许用户创建多个CEPH RBD克隆实例.这些特性应用于OpenStack等云平台中 ...
- Html::a 生成 method=post
<?= Html::a(Yii::t('app', 'delete'), ['delete', 'id' => $model->id], [ 'class' => 'btn b ...
- java.lang.ClassNotFoundException: org.springframework.orm.hibernate3.LocalSessionFactoryBean
Caused by: java.lang.ClassNotFoundException: org.springframework.orm.hibernate3.LocalSessionFactoryB ...
- Spring AOP 详解 【转】
此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP 来解决.一方面是为了以更加灵活的方式来解决问题,另 ...
- [Lua快速了解一下]Lua的Table
Lua中的Table其实就是一个Key Value的structure haoel = {name=, handsome=True} -table的CRUD操作 haoel.website=" ...
- 解决NIOS II工程移动在磁盘上位置后project无法编译问题
说明:本文档于2017年3月4日由小梅哥更新部分内容,主要是增加了讲解以Quartus II13.0为代表的经典版本和以15.1为代表的更新版本之间,解决问题的一些小的差异. 如果用户只是想快速解决问 ...
- [VSTO] warning CS0467 解决方案
warning CS0467: Ambiguity between method 'Microsoft.Office.Interop.Word._Document.Close(ref object, ...