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 ...
随机推荐
- js generator数据类型
1. 概述 generator 是ES6引入的新的数据类型, 看上去像一个函数,除了使用return返回, yield可以返回多次. generator 由function* 定义, (注意*号), ...
- Spring框架之AOP
SpringAop: 1.加入 jar 包 com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver ...
- PHP学习笔记:利用gd库给图片打图片水印
<?php $dst_path = '1.jpg';//目标图片 $src_path = 'logo1.png';//水印图片 //创建图片的实例 $dst = imagecreatefroms ...
- [Architecture Design] CLK Architecture
CLK.Prototype.Architecture 最近找数据,看到了博客园在不久之前,办了一个架构分享的活动:.Net项目分层与文件夹结构大全.看完之后觉得获益良多,接着也忍不住手痒,开始整理属于 ...
- 【使用 DOM】使用 Document 对象
Document 对象时通往DOM功能的入口,它向你提供了当前文档的信息,以及一组可供探索.导航.搜索或操作结构与内容的功能. 我们通过全局变量document访问Document对象,它是浏览器为我 ...
- jQuery 的 ajax
jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. $(selector).load ...
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q51-Q53)
Question 51You use a third-party site definition to create SharePoint sites.You need to add a Web Pa ...
- 浅谈Hex编码算法
一.什么是Hex 将每一个字节表示的十六进制表示的内容,用字符串来显示. 二.作用 将不可见的,复杂的字节数组数据,转换为可显示的字符串数据 类似于Base64编码算法 区别:Base64将三个字节转 ...
- Android 优秀的开源框架整理
第一部分:系统架构 thinkAndroid https://github.com/white-cat/ThinkAndroid ThinkAndroid是一个免费的开源的.简易的.遵循Apache2 ...
- github与eclipse创建仓库及克隆仓库
1.前往github官网注册账号,并下载客户端: 2.为eclipse工程创建本地仓库: 1,目前大多eclipse都预装了egit插件,如果没有请自行安装 2,在eclipse内创建工程->右 ...