[树状数组] poj 1990 MooFest
2016-07-27 21:36
369 查看
代码
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<map> using namespace std; const int maxn=2e4+5; struct Cow { int v,p; friend bool operator<(Cow x,Cow y) { if(x.v<y.v) return true; if(x.v==y.v) return x.p<y.p; return false; } }cow[maxn]; int n; int num; int maxb; int bit[maxn],bitn[maxn]; inline int lowbit(int x){return x&-x;} void add(int x) { for(int i=x;i<=maxb;i+=lowbit(i)) { bit[i]+=x; bitn[i]++; } } long long getsum(int x) { long long res=0; for(int i=x;i>0;i-=lowbit(i)) res+=bit[i]; return res; } long long getnum(int x) { long long res=0; for(int i=x;i>0;i-=lowbit(i)) res+=bitn[i]; return res; } int main() { cin>>n; maxb=-1; memset(bit,0,sizeof bit); memset(bitn,0,sizeof bitn); for(int i=0;i<n;i++) scanf("%d%d",&cow[i].v,&cow[i].p), maxb=max(maxb,cow[i].p); sort(cow,cow+n); long long ans=0; for(int i=0;i<n;i++) { num=getnum(cow[i].p); ans+=(2*(num*cow[i].p-getsum(cow[i].p))+getsum(maxb)-i*cow[i].p)*cow[i].v; add(cow[i].p); } cout<<ans<<endl; return 0; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#数据结构之顺序表(SeqList)实例详解
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- Lua教程(七):数据结构详解
- C#算法函数:获取一个字符串中的最大长度的数字
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码