题意:n 头牛,每头牛有两个属性值 耳聋程度 w 和坐标 x ( x保证互不相同 ),两头牛i,j可以联系的最低代价是 abs(xi-xj)*max(wi,wj),求所有牛相互联系的最低代价总和;

分析:按照耳聋程度从小到大排序,那么每加进一头牛,它的耳聋程度是最大的,即:

那么问题就转化成每一次加进一头牛如何求它与之前所有牛的距离和,到这个点,区间维护的问题,应该可以想到用线段树或者树状数组做了

树状数组:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;typedef long long ll;
const int N = 20000+10;
ll lowbit(ll x){return x&(-x);}struct node{int x,w;node(){}node(int _w,int _x){w=_w,x=_x;} bool operator < (const node& a)const{return w<a.w;}
}e[N];ll num[N];
ll sum[N];
int m;void add(ll s[],ll k,ll x){while(k<=m){s[k]+=x;k+=lowbit(k);}
}ll ssum(ll s[],ll k){ll sum=0;while(k>0){sum+=s[k];k-=lowbit(k);}return sum;
}int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d%d",&e[i].w,&e[i].x),m=max(m,e[i].x);sort(e+1,e+n+1);ll ans=0;for(int i=1;i<=n;i++){ll num1=ssum(num,e[i].x);  //比当前牛坐标小的已经遍历过的牛的数量ll num2=ssum(num,m);       //前面所有牛的数量ll sum1=ssum(sum,e[i].x);  //比当前牛坐标小的遍历过的牛的坐标和ll sum2=ssum(sum,m);       //前面所有牛的坐标和ans+=e[i].w*((sum2-sum1)-(num2-num1)*e[i].x+num1*e[i].x-sum1);add(num,e[i].x,1);         //更新add(sum,e[i].x,e[i].x);}printf("%lld",ans);
} 

线段树:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;typedef long long ll;
const int N = 20000+10;struct node{int id,x,w;node(){}node(int _id,int _x,int _w){id=_id,x=_x,w=_w;}
}e[N];
bool cmp1(node a,node b){return a.x<b.x;
}
bool cmp2(node a,node b){return a.w<b.w;
}
int n;
void input(){scanf("%d",&n);for(int i=1;i<=n;i++){int x,w;scanf("%d%d",&w,&x);e[i]=node(0,x,w);}sort(e+1,e+n+1,cmp1);for(int i=1;i<=n;i++) e[i].id=i;sort(e+1,e+n+1,cmp2);
}struct edge{ll sum,num;edge(){}edge(ll _num,ll _sum){num=_num,sum=_sum; }
}tree[N<<2];edge operator + (edge a,edge b){return edge(a.num+b.num,a.sum+b.sum);
}void build(int l,int r,int rt){if(l==r){tree[rt]=edge(0,0);return;}int m=(l+r)>>1;build(l,m,rt<<1);build(m+1,r,rt<<1|1);tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}void update(int l,int r,int rt,int id,int x){if(l==r){tree[rt]=edge(1,x);return;}int m=(l+r)>>1;if(id<=m) update(l,m,rt<<1,id,x);else update(m+1,r,rt<<1|1,id,x);tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}edge query(int l,int r,int rt,int L,int R){if(L>R) return edge(0,0);if(L<=l&&r<=R){return tree[rt];}int m=(l+r)>>1;edge A=edge(0,0),B=edge(0,0);if(m<R)  A=query(m+1,r,rt<<1|1,L,R);if(m>=L) B=query(l,m,rt<<1,L,R);return A+B;
}void solve(){build(1,n,1); ll ans=0;for(int i=2;i<=n;i++){update(1,n,1,e[i-1].id,e[i-1].x);edge des=query(1,n,1,1,e[i].id);edge as =query(1,n,1,e[i].id,n);ans+=(ll)e[i].w*(des.num*e[i].x-des.sum);ans+=(ll)e[i].w*( as.sum-as.num*e[i].x);}printf("%lld",ans);
}int main()
{input();solve();
}

POJ - 1990 (MooFest)相关推荐

  1. poj 1990 MooFest(转化成树状数组求和)

    题目大意:一群牛参加完牛的节日后都有了不同程度的耳聋,第i头牛听见别人的讲话,别人的音量必须大于v[i],当两头牛i,j交流的时候,交流的最小声音为max{v[i],v[j]}*他们之间的距离.现在有 ...

  2. POJ - 1990 MooFest

    题意:一排牛,每头牛(坐标pos,听力v),如果牛i和牛j交流的话,需要max{v[i],v[j]}*abs(pos[i]-pos[j]),求两两交流的总和. 思路:还是求逆序数对的思想,按坐标排序后 ...

  3. MooFest POJ - 1990

    题意:n 头牛,每两头牛之间产生的价值是 max(a[i].v , a[j].v ) * |a[i].x - a[j].x|,问产生的总费用是多少 题解:先将每头牛按照 v 的大小从小到大排序,那么就 ...

  4. poi 1990 MooFest(树状数组题目,转换成两个树状数组来做)较难的题目****

    1.http://poj.org/problem?id=1990 2.题目大意: 题意:FJ有n头牛,排列成一条直线(不会在同一个点),给出每头牛在直线上的坐标x.另外,每头牛还有一个自己的声调w,如 ...

  5. POJ 1990 (树状数组入门)

    MooFest Every year, Farmer John's N (1 <= N <= 20,000) cows attend "MooFest",a socia ...

  6. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  7. 【转载】树状数组题目

    先提个注意点,由于Lowbit(0) = 0,这会导致x递增的那条路径发生死循环,所有当树状数组中可能出现0时,我们都全部加一,这样可以避免0带来的麻烦-- 简单:       POJ 2299 Ul ...

  8. 如此好的树状数组学习资料

    树状数组学习系列1 之 初步分析--czyuan原创 其实学树状数组说白了就是看那张图,那张树状数组和一般数组的关系的,看懂了基本就没问题了,推荐下面这个教程:http://www.topcoder. ...

  9. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

最新文章

  1. python常用函数-python—各种常用函数及库
  2. Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)
  3. 在Nginx上配置NameCheap免费SSL
  4. 【Python之旅】第二篇(七):集合
  5. vue 获取元素高度
  6. mysql什么是覆盖索引,MySQL中的覆盖索引
  7. Docker学习总结(17)——学会使用Dockerfile
  8. One账户多设备同步的数据库设计
  9. Spring中实现AOP的三种方式
  10. dcs world f15c教学_【温故知新】DCS如何操作?看这篇就全懂了!
  11. rovio论文解读,及工程应用经验总结
  12. ArcGIS模拟3D洪水
  13. ESP32入门之程序烧录:烧录错误总结
  14. ERROR Exiting Kafka due to fatal exception (kafka.Kafka$)[已解决]
  15. 2021BI及数据可视化领域最具商业合作价值企业盘点
  16. 技术问答站点与论坛为什么半死不活
  17. Redis-----什么是Redis?
  18. 汽车电子之Infineon车规级芯片
  19. 利用高德地图API批量获取地点经纬度和行车线路与OD距离(excel和python)
  20. 整合管理,整合什么?

热门文章

  1. 阿里云oss简单的上传下载删除(java)
  2. 一篇文章搞定java中的垃圾回收机制面试题
  3. linux挂载硬盘 到根目录,怎样把新硬盘挂载到centos系统的根目录?
  4. 推荐一个HTML5资源站
  5. 阅读分析程序源代码的一些方法(转载整理)
  6. Gerrit推送代码失败
  7. Eagles 不朽经典《Hotel California》歌词翻译
  8. java代码美化json格式
  9. 移动应用程序开发_什么是移动应用程序开发?
  10. Windows Installer CleanU(Windows 安装程序清理实用程序 )