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[i]表示i的坐标
解法:将牛按听力从小到大排序,这样就可以使每次算一头牛与别的牛的值时听力永远取自己的听力。
建两棵树状数组,一颗维护牛的坐标,一颗维护牛的个数。
当遍历到某头牛 i 时,求出它的左边有多少头牛,记为L,右边记为R,并且算出左边的坐标之和Lsum,右边坐标值的和Rsum。
那么此时 总的和要加上 (L*x[i]-Lsum)*V[i] (左边) + (Rsum-R*x[i])*V[i] (右边), 仔细想想就知道了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 20007 int c[N],cnt[N],n,maxi;
struct node
{
int val,x;
}p[N]; int cmp(node ka,node kb) { return ka.val < kb.val; }
int lowbit(int x) { return x&-x; } void modify(int *c,int x,int val)
{
while(x <= maxi)
c[x] += val, x += lowbit(x);
} int getsum(int *c,int x)
{
int res = ;
while(x > ) { res += c[x]; x -= lowbit(x); }
return res;
} int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
maxi = ;
for(i=;i<=n;i++)
scanf("%d%d",&p[i].val,&p[i].x), maxi = max(maxi,p[i].x);
sort(p+,p+n+,cmp);
memset(c,,sizeof(c));
memset(cnt,,sizeof(cnt));
lll sum = ;
for(i=;i<=n;i++)
{
int L = getsum(cnt,p[i].x);
int R = getsum(cnt,maxi) - getsum(cnt,p[i].x-);
int Lsum = getsum(c,p[i].x);
int Rsum = getsum(c,maxi) - getsum(c,p[i].x-);
sum += 1LL*(p[i].x*L-Lsum)*p[i].val;
sum += 1LL*(Rsum-p[i].x*R)*p[i].val;
modify(c,p[i].x,p[i].x);
modify(cnt,p[i].x,);
}
cout<<sum<<endl;
}
return ;
}
POJ 1990 MooFest --树状数组的更多相关文章
- poj 2229 Ultra-QuickSort(树状数组求逆序数)
题目链接:http://poj.org/problem?id=2299 题目大意:给定n个数,要求这些数构成的逆序对的个数. 可以采用归并排序,也可以使用树状数组 可以把数一个个插入到树状数组中, 每 ...
- POJ 2299 【树状数组 离散化】
题目链接:POJ 2299 Ultra-QuickSort Description In this problem, you have to analyze a particular sorting ...
- poj 2155 Matrix (树状数组)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16797 Accepted: 6312 Descripti ...
- poj 3067 - Japan(树状数组)
先按第一个数从大到小排序,相等的情况下,第二个数按照从大到小排序..... 预处理后,照着树状数组写就行了... 注意:k的最大值应取1000*1000 代码如下: include <cstdi ...
- poj 2481 - Cows(树状数组)
看的人家的思路,没有理解清楚,,, 结果一直改一直交,,wa了4次才交上,,, 注意: 为了使用树状数组,我们要按照e从大到小排序.但s要从小到大.(我开始的时候错在这里了) 代码如下: #inclu ...
- POJ 3468(树状数组的威力)
之前说过这是线段树的裸题,但是当看了http://kenby.iteye.com/blog/962159 这篇题解后我简直震惊了,竟然能如此巧妙地转化为用树状数组来处理,附上部分截图(最好还是进入原网 ...
- POJ 2352 【树状数组】
题意: 给了很多星星的坐标,星星的特征值是不比他自己本身高而且不在它右边的星星数. 给定的输入数据是按照y升序排序的,y相同的情况下按照x排列,x和y都是介于0和32000之间的整数.每个坐标最多有一 ...
- POJ 2182【树状数组】
题意: 每头牛有编号,他们乱序排成一排,每头牛只知道前边比自己序号小的有几位. 思路: 递推,最后一只牛的编号是确定的,然后不断进行区间更新,直到找到某个空位前方恰好有n个空位. 这题跟某道排队的题思 ...
- POJ 2309 BST 树状数组基本操作
Description Consider an infinite full binary search tree (see the figure below), the numbers in the ...
随机推荐
- struts2 java.lang.StackOverflowError org.apache.struts2.json.JSONWriter
1. 问题描述: 页面通过异步访问action, action的方法通过map封装数据,struts的result的type设置为json,后台报错 六月 25, 2016 6:54:33 下午 ...
- C程序(3)
- linux shell 编程
1,获取命令执行的结果,字符串拼接(脚本最常使用的功能) cmd_result=$(date +%Y%b%d) //使用变量获取命令执行的结果 或者 cmd_result=`date ...
- Android性能优化之一:ViewStub
ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...
- Javascript中的Label语句
在javascript中,我们可能很少会去用到 Label 语句,但是熟练的应用 Label 语句,尤其是在嵌套循环中熟练应用 break, continue 与 Label 可以精确的返回到你想要的 ...
- C#进制转换
//十进制转二进制 Console.WriteLine(Convert.ToString(69, 2)); //十进制转八进制 Console.WriteLine(Convert.ToString(6 ...
- 数据库表-DD01L DD02L DD03L-保存数据表和域的消息
DD01L 定义域 DD02L SAP-表,记录每张数据库表和自定义表的表相关信息 DD03L 定义字段,记录数据表和自定义表中每个字段相关信息
- 【原】自定义UIPageControl的圆点
在下面的两种情况下会导致圆点贴图刷新: 1.用户调用setCurrentPage:(NSInteger)currentPage时 所以重载这个函数便可拦截 2.点击圆点矩形区域时 这说明,我们 ...
- Android源码分析之Message
准备开始写点东西,算是对自己阅读源码的一个记录/笔记,也希望能对同样感兴趣的人有所帮助,希望能坚持下去,加油. 在Android的开发中,我们经常用到Handler.postXXX方法,或者View. ...
- c语言中的部分字符串和字符函数
// // main.c // homeWork1230 // // #include <stdio.h> #include <string.h> #include <c ...