传送门

Description

约翰的\(N\)头奶牛每年都会参加“哞哞大会”。哞哞大会是奶牛界的盛事。集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等。它们参加活动时会聚在一起,第i 头奶牛的坐标为Xi,没有两头奶牛的坐标是相同的。奶牛们的叫声很大,第i 头和第j 头奶牛交流,会发出\(max(V_i, V_j)~\times~|X_i − X_j |\) 的音量,其中\(V_i\) 和\(V_j\) 分别是第\(i\) 头和第\(j\),头奶牛的听力。假设每对奶牛之间同时都在说话,请计算所有奶牛产生的音量之和是多少。

Input

第一行:单个整数\(N\)

第二行到第\(N + 1\) 行:第\(i + 1\) 行有两个整数\(V_i\)和\(X_i\)。

Output

单个整数:表示所有奶牛产生的音量之和

Sample Input

  1. 4
  2. 3 1
  3. 2 5
  4. 2 6
  5. 4 3

Sample Output

  1. 57

Hint

所有数据\(\leq~20000\)

Solution

发现枚举每两头奶牛是一件非常傻逼的事情。所以考虑对于每对奶牛,计算每头\(v\)更小(或更大)的牛的答案。

为了破除掉\(max\)的干扰,可以按照\(v\)升序排序,这样扫一遍数组,就可以对于每个位置只计算它之前的牛的位置差最后乘v即可。

考虑快速求出每个位置之前的x值。

对于\(i\)之前的每个\(x_j\),共有两种,分别是大于\(x_i\)和小于\(x_i\)的。这样按照坐标建立树状数组可以统计他之前之后\(x_j\)的和以及个数,可以轻松算出该位置的ans。

Code

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define rg register
  4. #define ci const int
  5. #define cl const long long int
  6. typedef long long int ll;
  7. namespace IO {
  8. char buf[90];
  9. }
  10. template<typename T>
  11. inline void qr(T &x) {
  12. char ch=getchar(),lst=' ';
  13. while(ch>'9'||ch<'0') lst=ch,ch=getchar();
  14. while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
  15. if(lst=='-') x=-x;
  16. }
  17. template<typename T>
  18. inline void write(T x,const char aft,const bool pt) {
  19. if(x<0) x=-x,putchar('-');
  20. int top=0;
  21. do {
  22. IO::buf[++top]=x%10+'0';
  23. x/=10;
  24. } while(x);
  25. while(top) putchar(IO::buf[top--]);
  26. if(pt) putchar(aft);
  27. }
  28. template<typename T>
  29. inline T mmax(const T a,const T b) {if(a>b) return a;return b;}
  30. template<typename T>
  31. inline T mmin(const T a,const T b) {if(a<b) return a;return b;}
  32. template<typename T>
  33. inline T mabs(const T a) {if(a<0) return -a;return a;}
  34. template<typename T>
  35. inline void mswap(T &a,T &b) {
  36. T temp=a;a=b;b=temp;
  37. }
  38. const int maxn = 20010;
  39. const int upceil = 20000;
  40. struct Tree {
  41. int cnt;ll sum;
  42. inline Tree(int _a=0,ll _b=0) {cnt=_a,sum=_b;}
  43. };
  44. Tree frog[maxn];
  45. struct M {
  46. int v,x;
  47. inline bool operator<(const M &_others) const {
  48. return this->v<_others.v;
  49. }
  50. };
  51. M MU[maxn];
  52. int n;
  53. ll ans;
  54. inline int lowbit(ci x) {return x&((~x)+1);}
  55. void add(ci);
  56. Tree ask(int);
  57. int main() {
  58. qr(n);
  59. for(rg int i=1;i<=n;++i) {qr(MU[i].v);qr(MU[i].x);}
  60. std::sort(MU+1,MU+1+n);
  61. for(rg int i=1;i<=n;++i) {
  62. Tree _ans1=ask(MU[i].x),_ans2=ask(upceil);
  63. ans+=(1ll*_ans1.cnt*MU[i].x-_ans1.sum+(_ans2.sum-_ans1.sum)-1ll*(_ans2.cnt-_ans1.cnt)*MU[i].x)*MU[i].v;
  64. add(MU[i].x);
  65. }
  66. write(ans,'\n',true);
  67. return 0;
  68. }
  69. Tree ask(int x) {
  70. ll _sum=0;int _cnt=0;
  71. while(x) {
  72. _sum+=frog[x].sum;
  73. _cnt+=frog[x].cnt;
  74. x-=lowbit(x);
  75. }
  76. return Tree(_cnt,_sum);
  77. }
  78. void add(ci x) {
  79. int _c=x;
  80. while(_c<=upceil) {
  81. frog[_c].sum+=x;
  82. ++frog[_c].cnt;
  83. _c+=lowbit(_c);
  84. }
  85. }

Summary

当计算被最大值限制时,可以考虑升/降序排序一次计算该位置从而避免最大值的\(O(n^2)\)枚举

【树状数组】【P2345】 奶牛集会的更多相关文章

  1. MooFest POJ - 1990 (树状数组)

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

  2. Luogu2345 | 奶牛集会 (树状数组)

    题目背景 MooFest, 2004 Open 题目描述 约翰的 \(N\) 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的 ...

  3. 【USACO】奶牛抗议 树状数组+dp

    题目描述 约翰家的 N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第 i 位的奶牛 的理智度为 A i ,数字可正可负. 约翰希望奶牛在抗议时保持理性,为此,他打算将这条队伍分割成几 ...

  4. [USACO]奶牛抗议(DP+树状数组+离散化)

    Description 约翰家的N头奶牛聚集在一起,排成一列,正在进行一项抗议活动.第i头奶牛的理智度 为Ai,Ai可能是负数.约翰希望奶牛在抗议时保持理性,为此,他打算将所有的奶牛隔离成 若干个小组 ...

  5. P2344 奶牛抗议 离散化+前缀和+动态规划+树状数组

    [题目背景] Generic Cow Protests, 2011 Feb [题目描述] 约翰家的N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第i 位的奶牛的理智度为Ai,数字可正 ...

  6. 奶牛抗议 DP 树状数组

    奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i] ...

  7. LUOGU P2344 奶牛抗议 (树状数组优化dp)

    传送门 解题思路 树状数组优化dp,f[i]表示前i个奶牛的分组的个数,那么很容易得出$f[i]=\sum\limits_{1\leq j\leq i}f[j-1]*(sum[i]\ge sum[j- ...

  8. bzoj 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛【dp+树状数组+hash】

    最长上升子序列.虽然数据可以直接n方但是另写了个nlogn的 转移:f[i]=max(f[j]+1)(a[j]<a[i]) O(n^2) #include<iostream> #in ...

  9. 洛谷 P2345 奶牛集会 解题报告

    P2345 奶牛集会 题目背景 MooFest, 2004 Open 题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨 ...

随机推荐

  1. Linux用户及权限

    库:lib 共享库:.so ,shared object, 权限: 用户,获取资源,服务的标识符 组,指派权限,标识符 进程:以某个用户的身份在进行,有属主和属组 安全上下文(security con ...

  2. 【机器学习】多项式回归sklearn实现

    [机器学习]多项式回归原理介绍 [机器学习]多项式回归python实现 [机器学习]多项式回归sklearn实现 使用sklearn框架实现多项式回归.使用框架更方便,可以少写很多代码. 使用一个简单 ...

  3. 在 Ubuntu 下安装 Deepin 的 QQ、微信、百度云和迅雷等软件

    在以前的文章 Ubuntu 常用软件推荐(QQ.微信.MATLAB等)及安装过程 中,我们用 Wine QQ 和 Electronic Wechat 来解决 Ubuntu 系统下使用 QQ 和微信的难 ...

  4. zabbix 2.2.2 安装部署

    zabbix 2.2.2版本与1.8.3版本安装过程略有不同,下面为实施步骤: 服务端:172.16.1.61 客户端:172.16.1.8 搭建zbbix软件 安装LAMP环境及依赖包 [root@ ...

  5. LINUX监控一:监控命令

    简单的整理一下常用的linux监控命令 本篇参考了:http://www.cnblogs.com/JemBai/archive/2010/07/30/1788484.html的内容 1.top top ...

  6. [leetcode-753-Open the Lock]

    You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: '0', '1', '2', '3', ...

  7. 11.24Daily Scrum(4)

    人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.1007 实现视频浏览的功能 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.1008 实现视频浏 ...

  8. 11.24Daily Scrum(2)

    人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.996 数据库测试 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.997 实现视频浏览的功能 王 ...

  9. Ubuntu 基础操作 基础命令 热键 man手册使用 关机 重启等命令使用

    . : 关机, 如果将Linux默认运行等级设置为0, 系统将无法启动; -- : 多用户模式, 允许使用网络文件系统, 一般不使用图形界面登陆就是这种模式; -- : 多用户图形界面模式, 该模式下 ...

  10. Java容器之Iterator接口

    Iterator 接口: 1. 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象. 2. Iterator 对象称作迭代器,用以方便的 ...