poj之旅——1990
来源:互联网 发布:淘宝售后客服快捷语 编辑:程序博客网 时间:2024/05/28 15:27
题目描述:给出n个人,每个人都在x轴上的x[i]处,各用v[i]的音量与别人说话,两个人之间互相说话的产生音量为distance*max{v[i],v[j]},为问每个人两两之间说话,总音量是多少。
题解:第一看到这题目傻眼了,觉得不就是显摆摆的模拟,不用模拟没办法做,后来才知道用树状数组。
首先按音量排序,这样我们就可以保证当前计算的人的音量是最大的。当然,a和b说话,我们可以在a处计算,也可以在b处计算,所以就保证当前最优性了。
然后维护两个树状数组,一个表示在当前人之前之后的人数和,一个表示在当前人之前之后人的音量和,边做边维护即可。当前人和音量比他小的人说话的总和为:
(left*x-sum(1,x)+sum(x,maxn)-right*x)*v[i].
参考程序:
#include<cstdio>#include<algorithm>#define maxn 21000using namespace std;typedef long long LL;struct Cow{int v,loc;bool operator < (Cow b) const {return v<b.v;}}a[maxn];struct Bit{LL a[maxn];LL bit(LL x){return x & (-x);}LL Sum(int x){int tt=0;while (x>0){tt+=a[x];x-=bit(x);}return tt;}LL query(int from,int to){return Sum(to-1)-Sum(from-1);}void add(int i,LL x){while (i<=maxn){a[i]+=x;i+=bit(i);}}}cnt,sum;int n;int main(){scanf("%d",&n);for (int i=0;i<n;i++)scanf("%d %d",&a[i].v,&a[i].loc);sort(a,a+n);LL ans=0;for (int i=0;i<n;i++){int v=a[i].v,x=a[i].loc;LL left=cnt.query(1,x),right=cnt.query(x,maxn);ans+=v*((left*x-sum.query(1,x))+(sum.query(x,maxn)-right*x));cnt.add(x,1);sum.add(x,x);}printf("%lld",ans);return 0;}
1 0
- poj之旅——1990
- poj之旅——3258
- poj之旅——3273
- poj之旅——3104
- poj之旅——3045
- poj之旅——2976
- poj之旅——3111。
- poj之旅——3579
- poj之旅——1979
- poj之旅——3009
- poj之旅——3669
- poj之旅——2718
- poj之旅——3187
- poj之旅——3050
- poj之旅——2376
- poj之旅——1328
- poj之旅——3190
- poj之旅——2393
- 微信网页第三方登录原理 微信开放平台和公众平台的区别 1.公众平台面向的时普通的用户,比如自媒体和媒体,企业官方微信公众账号运营人员使用,当然你所在的团队或者公司有实力去开发一些内容,也可以调用公众
- 第四章 Controller接口控制器详解 (4)——跟着开涛学SpringMVC
- 研究一个Android list视图下拉动效开源库
- 微信网页第三方登录原理
- eclipse(修改注释作者名称)
- poj之旅——1990
- 小草说----大数据和机器学习为什么这样火
- windows cocos2d-x OpenGL error 0x0506 quick-cocos2d-x\lib\cocos2d-x\cocos2dx\sprite_nodes\ccsprite.c
- 各大平台的免费接口
- 关于PHP返回json的处理
- C语言或者OC的命名法则
- joomla 参考资料列表(持续更新)
- ListView中使用EditText(解决EditText焦点丢失、保存数据以及滚动冲突的问题)
- 快速排序