HDU 3015 Disharmony Trees(树状数组)
题意:给你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的差的总和。
这样我们就可以使用树状数组维护两个值:每个位置值的个数,每个位置值的总大小,接着细心点处理就好了
- #include<set>
- #include<map>
- #include<queue>
- #include<stack>
- #include<cmath>
- #include<vector>
- #include<string>
- #include<cstdio>
- #include<cstring>
- #include<stdlib.h>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- #define eps 1E-8
- /*注意可能会有输出-0.000*/
- #define Sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
- #define Cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
- #define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
- #define mul(a,b) (a<<b)
- #define dir(a,b) (a>>b)
- typedef long long ll;
- typedef unsigned long long ull;
- const int Inf=<<;
- const double Pi=acos(-1.0);
- const int Mod=1e9+;
- const int Max=;
- struct node
- {
- int sub,minx;
- } tree[Max];
- int n;
- bool cmpt(struct node p1,struct node p2)
- {
- return p1.sub<p2.sub;
- }
- bool cmp(struct node p1,struct node p2)
- {
- return p1.minx<p2.minx;//按照最值排序才能固定一个值
- }
- int lowbit(int x)
- {
- return x&(-x);
- }
- void Add(ll *bit,int x,ll y)
- {
- while(x<=n)
- {
- bit[x]+=y;
- x+=lowbit(x);
- }
- return;
- }
- ll Sum(ll *bit,int x)
- {
- ll sum=0ll;
- while(x)
- {
- sum+=bit[x];
- x-=lowbit(x);
- }
- return sum;
- }
- ll bit[Max],bit2[Max];//存个数 存大小
- ll Solve()
- {
- ll ans=0ll;
- memset(bit,0ll,sizeof(bit));
- memset(bit2,0ll,sizeof(bit2));
- for(int i=;i<n;++i)
- {
- Add(bit2,tree[i].sub,(ll)tree[i].sub);
- Add(bit,tree[i].sub,1ll);
- }
- for(int i=;i<n;++i)
- {
- Add(bit2,tree[i].sub,(ll)-tree[i].sub);
- Add(bit,tree[i].sub,-1ll);
- // printf("%d\n",tree[i].sub);
- ans+=(ll)tree[i].minx*(
- Sum(bit2,n)-Sum(bit2,tree[i].sub)-(ll)tree[i].sub*(Sum(bit,n)-Sum(bit,tree[i].sub))+
- (ll)tree[i].sub*Sum(bit,tree[i].sub)-Sum(bit2,tree[i].sub));//关键
- //printf("%I64d %I64d\n",ans,Sum(bit2,n)-Sum(bit,n)*tree[i].sub);
- }
- return ans;
- }
- int main()
- {
- int tmp;
- while(~scanf("%d",&n))
- {
- for(int i=; i<n; ++i)
- scanf("%d %d",&tree[i].sub,&tree[i].minx);
- sort(tree,tree+n,cmpt);//离散化
- tree[n].sub=tree[n].minx=-;
- tmp=;
- for(int i=; i<n; ++i)
- {
- if(tree[i].sub!=tree[i+].sub)
- {
- tree[i].sub=tmp;
- tmp=i+;
- }
- else
- {
- tree[i].sub=tmp;
- }
- }
- sort(tree,tree+n,cmp);
- tmp=;
- for(int i=; i<n; ++i)
- {
- if(tree[i].minx!=tree[i+].minx)
- {
- tree[i].minx=tmp;
- tmp=i+;
- }
- else
- {
- tree[i].minx=tmp;
- }
- }
- // for(int i=0;i<n;++i)
- // printf("%d %d\n",tree[i].sub,tree[i].minx);
- printf("%I64d\n",Solve());
- }
- return ;
- }
HDU 3015 Disharmony Trees(树状数组)的更多相关文章
- Disharmony Trees 树状数组
Disharmony Trees Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Su ...
- hdu 3015 Disharmony Trees (离散化+树状数组)
Disharmony Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU-3015 Disharmony Trees [数状数组]
Problem Description One day Sophia finds a very big square. There are n trees in the square. They ar ...
- HDU 3333 | Codeforces 703D 树状数组、离散化
HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...
- HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)
题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...
- HDU 3333 Turing Tree (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. //#pragma comment(l ...
- HDU 4325 Flowers(树状数组+离散化)
http://acm.hdu.edu.cn/showproblem.php?pid=4325 题意:给出n个区间和m个询问,每个询问为一个x,问有多少个区间包含了x. 思路: 因为数据量比较多,所以需 ...
- hdu 5775 Bubble Sort 树状数组
Bubble Sort 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 Description P is a permutation of t ...
- HDU - 1541 Stars 【树状数组】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意 求每个等级的星星有多少个 当前这个星星的左下角 有多少个 星星 它的等级就是多少 和它同一 ...
随机推荐
- a版本冲刺第五天
队名:Aruba 队员: 黄辉昌 李陈辉 林炳锋 鄢继仁 张秀锋 章 鼎 运动会这几天两位同学准备比赛也确实比较忙,两位同学又刚好有事回家去了,由于之前git解决一次冲突后,远程我们还不能很好地 ...
- Android热修复AndFix
热修复主要用来修复代码.修复bug.添加独立的功能,他的原理主要是操作PathClassLoader.DexClassLoader. PathClassLoader是类加载器,DexClassLoad ...
- centos上如何安装redis?|centos傻瓜式安装redis教程
本文介绍centos安装redis,请不要安装2.4.3,是有问题的. 首先安装gcc yum -y install gcc yum -y install gcc-c++ yum install ma ...
- 创建一个点状注记(MarkerElement)
1.根据XY创建一个点 /// <summary> /// 根据x y创建新点 /// </summary> /// <param name="dX" ...
- ArcGIS Server开发教程系列(1) Arcgis server 10.1 的安装
本系列所使用的软件版本如下: Windows 7 X64 / Windows server 2008 X64 Arcgis for Desktop 10.1 Arcgis 10.1 for serve ...
- 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 ...
- mate标签
<meta charset='utf-8'> <!-- 优先使用 IE 最新版本和 Chrome --> <meta http-equiv="X-UA-C ...
- 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 ...
- js自适应屏幕高度
//自适应屏幕高度 $(window).resize(function() { hightChange(); }); function hightChange(){ ; $();// iframe i ...
- tyvj1148 小船弯弯
描述 童年的我们,充满了新奇的想法.这天,小朋友们用彩虹画笔在云霞上绘制了世界上最美丽的图画.那描绘的是一条大河波浪宽,风吹稻花香两岸的情景.欣赏着自己的作品,小朋友们别提多开心了.这时,Q小朋友对C ...