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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电信手机卡充值了还停机怎么办 电信手机一直没用却欠费了怎么办 苹果se开起4g信号不好怎么办 触屏华为手机充不了电怎么办 华为手机自拍出来的字反向怎么办 华为微信隐藏了怎么弄出来怎么办 酷派手机酷管家密码忘了怎么办 手机磁盘目录不具有读写权限怎么办 魅族手机像素突然变模糊了怎么办 手机忽然所有软件都没了怎么办 魅族读书下架的书怎么办 我的电信大王卡激活了没信号怎么办 三星翻盖手机忘记锁屏密码怎么办 小米2s电信版信号不好怎么办 4s微信版本过低怎么办 换了一个城市牵的电信网线怎么办 联通电话卡注销了里面的钱怎么办 红米4a上网太慢怎么办 华为光猫网线接囗接触不良怎么办? 苹果电信4g信号变3g怎么办 苹果7的4g变3g了怎么办 华为路由器的登录密码忘记了怎么办 华为手机有4g但不能上网怎么办 移动4g 手机开密码忘了怎么办 华为安卓8.0屏幕上圆怎么办 苹果5s不能用4g怎么办 电动车的锁住了钥匙丢了怎么办 小米蓝牙耳机青春版开不了机怎么办 小米蓝牙耳机进水了开不了机怎么办 新买的蓝牙耳机开不了机怎么办 蓝牙耳机长时间不用开不了机怎么办 瑞和宝pos机无法连接蓝牙怎么办 手机做话筒连蓝牙音箱不同步怎么办 荣耀畅玩7x触屏不灵怎么办 华为6x屏幕点没反应怎么办 苹果耳机按一下就挂断电话怎么办 华为畅享7忘记账号密码怎么办 华为荣耀8手机外放声音小怎么办 安卓手机耳机减音量不能用怎么办 苹果手机微信语音是耳机模式怎么办 平果手机没声音出现耳机模式怎么办