一、题面

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. [c++] How many bytes do pointers take up?

    How many bytes do pointers take up? on 16 bit systems take up 2 bytes on 32 bit systems take up 4 by ...

  2. 使用python把图片存入数据库-乾颐堂

    一般情况下我们是把图片存储在文件系统中,而只在数据库中存储文件路径的,但是有时候也会有特殊的需求:把图片二进制存入数据库. 今天我们采用的是python+mysql的方式 MYSQL 是支持把图片存入 ...

  3. scala初学笔记

    tips: 1.函数的定义: def addOne(m: Int): Int = m + 1 m为参数,要指定其类型,Int: 后边跟着返回值的类型,Int= 后边是函数的内部 2.匿名函数: (x: ...

  4. PrintWriter类

    PrintWriter是一种过滤流,也是一种处理流,即能对字节流和字符流进行处理. 1.查询API后,我们发现,会有八种构造方法.即: PrintWriter(File file) Creates a ...

  5. PHP中文乱码解决办法[转]

    一.首先是PHP网页的编码1.     php文件本身的编码与网页的编码应匹配a.     如果欲使用gb2312编码,那么php要输出头:header(“Content-Type: text/htm ...

  6. Reactor模式和NIO(转载二)

    本文可看成是对Doug Lea Scalable IO in Java一文的翻译. 当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socket的操作.他们都有一个共同的 ...

  7. NYTimes Objective-C 编程风格指南

    转自eseedo的博客   [微博] NYTimes Objective-C 编程风格指南.来源:https://github.com/NYTimes/objective-c-style-guide ...

  8. centos安装mysql,tomcat

    软件下载: jre和jdk下载:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javas ...

  9. error: field 'b' has imcomplete type

    在下面的程序中,在编译时会遇到下面的错误: error: field 'b' has incomplete type 域b是一个不完备的类型,即class B的声明不完备 #include <i ...

  10. 如何执行oracle存储过程,就exec一下?

    不单单是exec一下,还是得分情况: 1.如果是命令窗口就用exec 存储过程名,举个栗子: EXEC procedure;--procedure是存储过程名 2.如果是PL/SQL窗口就用 begi ...