/*
写完这篇博客有很多感慨,过去一段时间都是看完题解刷题,刷题,看会题解,没有了大一那个时候什么都不会的时候刷题的感觉,
这个题做了一天半,从开始到结束都是从头开始自己构思的很有感觉,找回到当初的感觉
*/

Disharmony Trees

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 90 Accepted Submission(s): 56
 
Problem Description
One day Sophia finds a very big square. There are n trees in the square. They are all so tall. Sophia is very interesting in them.

She finds that trees maybe disharmony and the Disharmony Value between two trees is associated with two value called FAR and SHORT.

The FAR is defined as the following:If we rank all these trees according to their X Coordinates in ascending order.The tree with smallest X Coordinate is ranked 1th.The trees with the same X Coordinates are ranked the same. For example,if there are 5 tree with X Coordinates 3,3,1,3,4. Then their ranks may be 2,2,1,2,5. The FAR of two trees with X Coordinate ranks D1 and D2 is defined as F = abs(D1-D2).

The SHORT is defined similar to the FAR. If we rank all these trees according to their heights in ascending order,the tree with shortest height is ranked 1th.The trees with the same heights are ranked the same. For example, if there are 5 tree with heights 4,1,9,7,4. Then their ranks may be 2,1,5,4,2. The SHORT of two trees with height ranks H1 and H2 is defined as S=min(H1,H2).

Two tree’s Disharmony Value is defined as F*S. So from the definition above we can see that, if two trees’s FAR is larger , the Disharmony Value is bigger. And the Disharmony value is also associated with the shorter one of the two trees.

Now give you every tree’s X Coordinate and their height , Please tell Sophia the sum of every two trees’s Disharmony value among all trees.

 
Input
There are several test cases in the input

For each test case, the first line contain one integer N (2 <= N <= 100,000) N represents the number of trees.

Then following N lines, each line contain two integers : X, H (0 < X,H <=1,000,000,000 ), indicating the tree is located in Coordinates X and its height is H.

 
Output
For each test case output the sum of every two trees’s Disharmony value among all trees. The answer is within signed 64-bit integer.
 
Sample Input
2
10 100
20 200
4
10 100
50 500
20 200
20 100
 
Sample Output
1
13
 
 
Source
2009 Multi-University Training Contest 12 - Host by FZU
 
Recommend
gaojie
 
/*
错误思路:
按照高度排好序之后整个的求值过程就变成了h[1]*abs((n*a[1]-(a[2]+a[3]+..+a[n])))+h[2]*abs(((n-1)*a[2]-(a[3]+a[4]+..+a[n])))+.....
然后用树状数组维护a序列的值
解析:
因为绝对值的问题所以(n*a[1]-(a[2]+a[3]+..+a[n]))这个位置不能直接减去,要考虑大小才能把括号去掉 正确思路:
按照高排好序之后,每棵树的min_h肯定是本身的h,abs_a的话需要考虑从i到n的a与本身的大小
树状数组维护两个值比自己小的有多少个,还有维护a数组,
*/
#include<bits/stdc++.h>
#define N 100005
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
struct node
{
ll x,h;
ll rankx,rankh;
node(){}
node(ll a,ll b)
{
x=a;
h=b;
}
};
ll n;
ll x,h;
ll c[N];//用来构建树状数组维护到当前结点比当前结点小的个数
ll sum[N];//用来维护到当前结点比当前结点小的数的总和
node f[N];
bool cmp1(node a,node b)
{
return a.x<b.x;
}
bool cmp2(node a,node b)
{
return a.h<b.h;
}
bool cmp3(node a,node b)//这次排序从大到小排序,这样能使从0到i的所有计算中用到的h都是h[i];
{
return a.h>b.h;
}
void init()
{
memset(c,,sizeof c);
memset(sum,,sizeof sum);
}
void update1(ll x,ll val)
{
while(x<N)
{
c[x]+=val;
x+=lowbit(x);
}
}
void update2(ll x,ll val)
{
while(x<N)
{
sum[x]+=val;
x+=lowbit(x);
}
}
ll getsum1(ll x)//这个是获取有多少个比自己小的
{
ll s=;
while(x>)
{
s+=c[x];
x-=lowbit(x);
}
return s;
}
ll getsum2(ll x)//这个是获取比自己小的和
{
ll s=;
while(x>)
{
s+=sum[x];
x-=lowbit(x);
}
return s;
}
int main()
{
//freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
while(scanf("%lld",&n)!=EOF)
{
init();
f[]=node(-,-);
for(int i=;i<=n;i++)
{
scanf("%lld%lld",&x,&h);
f[i]=node(x,h);
}//处理输入 sort(f+,f+n+,cmp1);//先按照坐标的大小进行排序
for(int i=;i<=n;i++)
{
if(f[i].x==f[i-].x)
f[i].rankx=f[i-].rankx;
else
f[i].rankx=i;
} sort(f+,f+n+,cmp2);//然后按照树的高度的大小进行排序
for(int i=;i<=n;i++)
{
if(f[i].h==f[i-].h)
f[i].rankh=f[i-].rankh;
else
f[i].rankh=i;
}
sort(f+,f+n+,cmp3);//第三次排序保证每次运算用到的h都是h[i](也就是使得h[i]在0到i中最小;
ll cur=;
ll total=;
ll same=;//和自己相同的个数
ll low=;//比自己小的个数
ll big=;//比自己大的个数
ll low_sum=;//比自己小的和
ll big_sum=;//比自己大的和
//for(int i=1;i<=n;i++)
// cout<<f[i].rankx<<" ";
//cout<<endl;
for(int i=;i<=n;i++)
{
total+=f[i].rankx;//表示到当前位置的总坐标值 /*更新当前的信息*/
update1(f[i].rankx,);
update2(f[i].rankx,f[i].rankx);
//和当前位置相同的个数
same=getsum1(f[i].rankh)-getsum1(f[i].rankh-);
//比自己小的个数;
low=getsum1(f[i].rankx-);
//比自己大的个数
big=i-same-low;
//比自己小的和
low_sum=getsum2(f[i].rankx-);
//比自己大的和
big_sum=total-low_sum-same*f[i].rankx;
//cout<<"total ="<<total<<endl;
//cout<<"getsum1(x) ="<<getsum1(x)<<endl;
//cout<<"i-getsum1(x)-1 ="<<i-getsum1(x)-1<<endl;
//cout<<"getsum2(x) ="<<getsum2(x)<<endl;
//cout<<"total-getsum2(x)="<<total-getsum2(x)<<endl;
//cout<<endl; //比自己大的和减去比当前值大的和
cur+=f[i].rankh*((low*f[i].rankx-low_sum)+(big_sum-big*f[i].rankx));
//a[i]乘上比自己小的个数减去比自己小的和
}
printf("%lld\n",cur);
}
return ;
}

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. Disharmony Trees HDU - 3015

    Disharmony Trees HDU - 3015 One day Sophia finds a very big square. There are n trees in the square. ...

  4. hdu3015 Disharmony Trees

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

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

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

  6. 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) 求出 ...

  7. HDU 3015 Disharmony Trees

    题解:在路边有一行树,给出它们的坐标和高度,先按X坐标排序.记录排名,记为rankx,再按它们的高度排序,记录排名,记为rankh.两颗树i,j的差异度为 fabs(rankx[i]-rankx[j] ...

  8. HDU 3015 Disharmony Trees 【 树状数组 】

    题意:给出n棵树,给出横坐标x,还有它们的高度h,先按照横坐标排序,则它们的横坐标记为xx, 再按照它们的高度排序,记为hh 两颗树的差异度为 abs(xx[i] - xx[j]) * min(hh[ ...

  9. Disharmony Trees HDU - 3015 树状数组+离散化

    #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using ...

随机推荐

  1. 移动端与PHP服务端接口通信流程设计(增强版)

    增强地方一: 再增加2张表,一个接口表,一个授权表,设计参考如下: 接口表 字段名 字段类型 注释 api_id int 接口ID api_name varchar(120) 接口名,以"/ ...

  2. AngularJS–Scope(作用域)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ Scope Scope 是一个应用程序的模块的对象.它是表达式的执行上下文.它充斥在DO ...

  3. MySQL所学所思所想

    MySQL更改线上配置方案思想:原则上,需要备机.备份工作准备到位,有参数调优配置方案.有配置回退方案.有应急切换备机方案.以上方案评审无问题,然后可以和客户约定实施的时间.服务中断时间,先向客户侧申 ...

  4. 第一个ExtJS练习(添加用户面板)

    1.[准备] 我是在visual studio里面建立了一个asp.net MVC项目,然后导入ExtJS必要的包,然后写的. ExtJS5.1版本下载:https://pan.baidu.com/s ...

  5. Android打包版本号设置

    之前没有设置过打包的命名,每次打包都是默认的"app-realease.apk",之后手动修改名字来显示出它是一个新版本. 晚上学习了如何配置打包名称,很简单,修改build.gr ...

  6. Codeforces Round #309 (Div. 2)D

    C. Kyoya and Colored Balls time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  7. Bayesian CTR Prediction for Bing

    Microsoft published a paper in ICML 2009 named ‘Web-Scale Bayesian Click-Through Rate Prediction for ...

  8. JSP获取input(含正则表达式)

    <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> < ...

  9. jvm的垃圾回收算法

    一.对象存活判断判断对象是否存活一般有两种方式:1.引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,无法解决对象相互循环引用的问题.2 ...

  10. python 多进程间交换信息与共享信息

    多线程调用函数,获取其返回值,个人总结了三种方法: 一.Queue(进程队列) 构造方法:multiprocessing.Queue([maxsize]) Queue.Queue类即是一个队列的同步实 ...