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(或者相反).很巧 ...
随机推荐
- meshconverters
https://github.com/RobotLocomotion/meshConverters meshconverters $ mkdir build && cd build $ ...
- LWIP网络接口管理
LAN8720+RJ45+MAC(STM32F4自带的)构成了网络接口层.
- BWA/BWT 比对软件
名称 bwa – Burrows-Wheeler Alignment Tool 内容摘要描述命令行与选项SAM 比对格式短序列比对注意事项 比对精确性 估计插入大小分布 内存需求 ...
- git post-receive
1. 将 www 目录设为 777 2. 用git 用户 mkdir 并 git init 3. cat id_rsa.pub >. authorkeys
- (2)WePHP 控制器与使用模板
<?php class C_index extends Action { public function __initialize() { echo"自动执行"; } pub ...
- NSPredicate过滤数组数据
NSPredicate编写软件时,经常需要获取一个对象集合,然后删除不满足条件的对象,保留符合条件的对象,从而提供一些有意义的对象.Cocoa提供了一个名为NSPredicate的类,他用于指定过滤器 ...
- soapUI的bug切换版本解决
目录 文章背景 目录 运行环境及出现的问题 问题解决 说明 参考文章 版本记录 文章背景 为公司编写了一个webservice,本地测试时候是没有问题的,发布到现场之后,访问出现异常,通过切换soap ...
- 编写高质量代码改善C#程序的157个建议——建议104:用多态代替条件语句
建议104:用多态代替条件语句 假设要开发一个自动驾驶系统.在设计之初,此自动驾驶系统拥有一个驾驶系统命令的枚举类型: enum DriveCommand { Start, Stop } 当前该枚举存 ...
- [Lua快速了解一下]Lua的OOP
__index(a, b) 对应表达式 a.b 上面我们看到有__index这个重载,这个东西主要是重载了find key的操作.这波操作可以让Lua变得有点面向对象的感觉,让其有点像Javascri ...
- docker swarm 命令
初始化swarm manager并制定网卡地址 docker swarm init --advertise-addr 192.168.10.117 强制删除集群,如果是manager,需要加–forc ...