一、题面

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. SSL技术白皮书

    首页产品技术操作系统ComwareV5安全和VPN SSL技术白皮书 下载 收藏 打印 推荐 摘自:http://www.h3c.com/cn/d_200812/622834_30003_0.htm# ...

  2. Scala入门学习随笔

    推荐学习视频:慕课网http://www.imooc.com/learn/613,讲师:辰风 ScalaAPI:http://www.scala-lang.org/api/current/#packa ...

  3. 实践作业3:白盒测试----学习Junit框架DAY10.

    JUnit - 测试框架 首先应该了解什么是 Junit 测试框架? JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量.JUnit 测试框架能 ...

  4. exp,expdb,imp,impdb的使用

    1.使用expdp要先在数据库中创建directory,并给相应的用户read,write权限. SQL>create dexp和empdp的区别irectory dmpdir as ‘/u01 ...

  5. win7设置开机启动virtualBOX虚拟机

    如果常用VirtualBox虚拟机系统的话,设置随开机启动也是很方便的.不需要打开VirtualBox窗口,直接启动VirtualBox虚拟机系统就可以了. 设置开机自启动VirtualBox虚拟机系 ...

  6. JavaScript 算法应用: 遍历DOM树的两种方式

    1 常见的DOM树结构: 2  DOM数遍历有两种方式: 3 广度优先代码: 4 深度优先遍历代码

  7. Linux学习系列——零基础开始

    第一部分 Linux基础命令 1.查看系统信息命令 2.Linux内核版本 3.修改环境变量

  8. 使用GeoServer+OpenLayers发布和调用WMTS、Vector Tile矢量切片服务 | Publishing and Calling WMTS, Vector Tile Service Using GeoServer + OpenLayers

    Web GIS系列: 1.搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3 2.使用GeoServer+QGIS发布WMTS服务 3.使 ...

  9. mysql 查询条件

    1简单查询   select* from 表名 select name as“姓名”fromstu     (把name改为名字) 2条件查询 where 后面跟条件  条件要写清楚 3模糊查询  l ...

  10. css基础 引用方式 标签选择器 优先级 各式布局

    今天讲的css基础,了解了css即层叠式表,是美化网页,控制页面的样式. 样式表引进网页的3种方式1内联式,语法例子:<div style="width: 100px;height: ...