题意:给你n棵树,每棵树上有两个权值X H

对于X离散化 :3 7 1 5 3 6 -> 2 6 1 4 2 5,对于H一样

然后F = abs(X1-X2)   S=min(H1,H2)

求出每一对F*S的总和

可以看到一边是求每个数与其他数的最小值,一边是求每个数与其他数的差距。因此我们可以排序一边,处理另一边。

我们排序H,因为这样对于固定一个Xi Hi,从小到大每次都是Hi去乘以Xi与剩下的所有X的差的总和。

这样我们就可以使用树状数组维护两个值:每个位置值的个数,每个位置值的总大小,接着细心点处理就好了

  1. #include<set>
  2. #include<map>
  3. #include<queue>
  4. #include<stack>
  5. #include<cmath>
  6. #include<vector>
  7. #include<string>
  8. #include<cstdio>
  9. #include<cstring>
  10. #include<stdlib.h>
  11. #include<iostream>
  12. #include<algorithm>
  13. using namespace std;
  14. #define eps 1E-8
  15. /*注意可能会有输出-0.000*/
  16. #define Sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
  17. #define Cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
  18. #define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
  19. #define mul(a,b) (a<<b)
  20. #define dir(a,b) (a>>b)
  21. typedef long long ll;
  22. typedef unsigned long long ull;
  23. const int Inf=<<;
  24. const double Pi=acos(-1.0);
  25. const int Mod=1e9+;
  26. const int Max=;
  27. struct node
  28. {
  29. int sub,minx;
  30. } tree[Max];
  31. int n;
  32. bool cmpt(struct node p1,struct node p2)
  33. {
  34. return p1.sub<p2.sub;
  35. }
  36. bool cmp(struct node p1,struct node p2)
  37. {
  38. return p1.minx<p2.minx;//按照最值排序才能固定一个值
  39. }
  40. int lowbit(int x)
  41. {
  42. return x&(-x);
  43. }
  44. void Add(ll *bit,int x,ll y)
  45. {
  46. while(x<=n)
  47. {
  48. bit[x]+=y;
  49. x+=lowbit(x);
  50. }
  51. return;
  52. }
  53. ll Sum(ll *bit,int x)
  54. {
  55. ll sum=0ll;
  56. while(x)
  57. {
  58. sum+=bit[x];
  59. x-=lowbit(x);
  60. }
  61. return sum;
  62. }
  63. ll bit[Max],bit2[Max];//存个数 存大小
  64. ll Solve()
  65. {
  66. ll ans=0ll;
  67. memset(bit,0ll,sizeof(bit));
  68. memset(bit2,0ll,sizeof(bit2));
  69. for(int i=;i<n;++i)
  70. {
  71. Add(bit2,tree[i].sub,(ll)tree[i].sub);
  72. Add(bit,tree[i].sub,1ll);
  73. }
  74. for(int i=;i<n;++i)
  75. {
  76. Add(bit2,tree[i].sub,(ll)-tree[i].sub);
  77. Add(bit,tree[i].sub,-1ll);
  78. // printf("%d\n",tree[i].sub);
  79. ans+=(ll)tree[i].minx*(
  80. Sum(bit2,n)-Sum(bit2,tree[i].sub)-(ll)tree[i].sub*(Sum(bit,n)-Sum(bit,tree[i].sub))+
  81. (ll)tree[i].sub*Sum(bit,tree[i].sub)-Sum(bit2,tree[i].sub));//关键
  82. //printf("%I64d %I64d\n",ans,Sum(bit2,n)-Sum(bit,n)*tree[i].sub);
  83. }
  84. return ans;
  85. }
  86. int main()
  87. {
  88. int tmp;
  89. while(~scanf("%d",&n))
  90. {
  91. for(int i=; i<n; ++i)
  92. scanf("%d %d",&tree[i].sub,&tree[i].minx);
  93. sort(tree,tree+n,cmpt);//离散化
  94. tree[n].sub=tree[n].minx=-;
  95. tmp=;
  96. for(int i=; i<n; ++i)
  97. {
  98. if(tree[i].sub!=tree[i+].sub)
  99. {
  100. tree[i].sub=tmp;
  101. tmp=i+;
  102. }
  103. else
  104. {
  105. tree[i].sub=tmp;
  106. }
  107. }
  108. sort(tree,tree+n,cmp);
  109. tmp=;
  110. for(int i=; i<n; ++i)
  111. {
  112. if(tree[i].minx!=tree[i+].minx)
  113. {
  114. tree[i].minx=tmp;
  115. tmp=i+;
  116. }
  117. else
  118. {
  119. tree[i].minx=tmp;
  120. }
  121. }
  122. // for(int i=0;i<n;++i)
  123. // printf("%d %d\n",tree[i].sub,tree[i].minx);
  124. printf("%I64d\n",Solve());
  125. }
  126. return ;
  127. }

HDU 3015 Disharmony Trees(树状数组)的更多相关文章

  1. Disharmony Trees 树状数组

    Disharmony Trees Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Su ...

  2. hdu 3015 Disharmony Trees (离散化+树状数组)

    Disharmony Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. HDU-3015 Disharmony Trees [数状数组]

    Problem Description One day Sophia finds a very big square. There are n trees in the square. They ar ...

  4. HDU 3333 | Codeforces 703D 树状数组、离散化

    HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...

  5. HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)

    题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...

  6. HDU 3333 Turing Tree (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. //#pragma comment(l ...

  7. HDU 4325 Flowers(树状数组+离散化)

    http://acm.hdu.edu.cn/showproblem.php?pid=4325 题意:给出n个区间和m个询问,每个询问为一个x,问有多少个区间包含了x. 思路: 因为数据量比较多,所以需 ...

  8. hdu 5775 Bubble Sort 树状数组

    Bubble Sort 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 Description P is a permutation of t ...

  9. HDU - 1541 Stars 【树状数组】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意 求每个等级的星星有多少个 当前这个星星的左下角 有多少个 星星 它的等级就是多少 和它同一 ...

随机推荐

  1. a版本冲刺第五天

    队名:Aruba   队员: 黄辉昌 李陈辉 林炳锋 鄢继仁 张秀锋 章  鼎 运动会这几天两位同学准备比赛也确实比较忙,两位同学又刚好有事回家去了,由于之前git解决一次冲突后,远程我们还不能很好地 ...

  2. Android热修复AndFix

    热修复主要用来修复代码.修复bug.添加独立的功能,他的原理主要是操作PathClassLoader.DexClassLoader. PathClassLoader是类加载器,DexClassLoad ...

  3. centos上如何安装redis?|centos傻瓜式安装redis教程

    本文介绍centos安装redis,请不要安装2.4.3,是有问题的. 首先安装gcc yum -y install gcc yum -y install gcc-c++ yum install ma ...

  4. 创建一个点状注记(MarkerElement)

    1.根据XY创建一个点 /// <summary> /// 根据x y创建新点 /// </summary> /// <param name="dX" ...

  5. ArcGIS Server开发教程系列(1) Arcgis server 10.1 的安装

    本系列所使用的软件版本如下: Windows 7 X64 / Windows server 2008 X64 Arcgis for Desktop 10.1 Arcgis 10.1 for serve ...

  6. Google Map API V3开发(5)

    Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...

  7. mate标签

    <meta charset='utf-8'> <!-- 优先使用 IE 最新版本和 Chrome -->    <meta http-equiv="X-UA-C ...

  8. centos 7.1 apache 源码编译安装

    Apache编译安装 一,需要软件: http://mirrors.cnnic.cn/apache//apr/apr-1.5.2.tar.gz 1.apr-1.5.2.tar.gz http://mi ...

  9. js自适应屏幕高度

    //自适应屏幕高度 $(window).resize(function() { hightChange(); }); function hightChange(){ ; $();// iframe i ...

  10. tyvj1148 小船弯弯

    描述 童年的我们,充满了新奇的想法.这天,小朋友们用彩虹画笔在云霞上绘制了世界上最美丽的图画.那描绘的是一条大河波浪宽,风吹稻花香两岸的情景.欣赏着自己的作品,小朋友们别提多开心了.这时,Q小朋友对C ...