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

fabs(rankx[i]-rankx[j])*min(rankh[i],rankh[j])

最后求出任异两颗树差异度的和。

题解:首先,需要解决的是min(rh)的问题,对于这个问题,只要离散化之后按rh从大到小排序顺序求解即可,然后用树状数组维护之前出现rx比当前值小的个数与总和,那么同时就可以计算rx比当前大的个数和总和了,那么就可以依次计算出答案了。

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=100010;
struct node{long long x,h,rx,rh;}a[N];
int s[N],c[N],n;
long long ans,ns;
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){return a.h>b.h;}
void updata(int x,int num){while(x<=n)c[x]++,s[x]+=num,x+=x&-x;}
int time(int x){int t=0;while(x>0)t+=c[x],x-=x&-x;return t;}
int sum(int x){int t=0;while(x>0)t+=s[x],x-=x&-x;return t;}
int main(){
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++)s[i]=c[i]=0;
for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].h);
sort(a+1,a+n+1,cmp1);a[1].rx=1;
for(int i=2;i<=n;i++)a[i].rx=(a[i].x==a[i-1].x?a[i-1].rx:i);
sort(a+1,a+n+1,cmp2);a[1].rh=1;
for(int i=2;i<=n;i++)a[i].rh=(a[i].h==a[i-1].h?a[i-1].rh:i);
sort(a+1,a+n+1,cmp3);
ans=ns=0;
for(int i=1;i<=n;i++){
long long t=time(a[i].rx),m=sum(a[i].rx);
ans+=a[i].rh*(a[i].rx*t-m+ns-m-a[i].rx*(i-t-1));
updata(a[i].rx,a[i].rx);
ns+=a[i].rx;
}
cout<<ans<<endl;
}
return 0;
}

HDU 3015 Disharmony Trees的更多相关文章

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

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

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

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

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

  4. Disharmony Trees HDU - 3015

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

  5. Disharmony Trees 树状数组

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

  6. Disharmony Trees

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

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

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

  8. HDU 2841 Visible Trees 数论+容斥原理

    H - Visible Trees Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  9. hdu3015 Disharmony Trees

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

随机推荐

  1. PHP删除HTMl标签

    /** * 取出html标签 * * @access public * @param string str * @return string * */ function deletehtml($str ...

  2. iOS开发篇-AFNetworking 上传和下载

    最近用到了关于AFNetworking的上传和下载问题,顺便写到博客中,以供大家参考和研究. //下载NSURLSessionConfiguration *configuration = [NSURL ...

  3. MongoDB入门学习(一)—— 安装和启动

    最近由于工作需要,开始学习MongoDB数据库了.第一篇博文就从这里开始吧,以此记录下学习中的点点滴滴,为自己加油呢! (一) MongoDB简介 网上搜搜了一下:(来源:http://www.run ...

  4. Ubuntu的快捷键

    正如大家都知道的那样,Ubuntu的终端的Terminal能快捷的操作该linux系统,减少鼠标的使用.(vim党,尽量避免使用鼠标) 在Ubuntu中,终端的快捷键为(大小写无关的): Ctrl + ...

  5. Hadoop经典面试题(转)

    单项选择题 1. 下面哪个程序负责 HDFS 数据存储. a)NameNode b)Jobtracker c)Datanode d)secondaryNameNode e)tasktracker 2. ...

  6. MarkDown使用 (二)矩阵

    MarkDown的矩阵输入 MarkDown的矩阵输入 简单的Matrix 例如 $$ \begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ ...

  7. 模拟post请求(PHP)

    <?php //=========================模拟post请求==================================== // ================ ...

  8. python基础学习笔记5--对象方法、属性和迭代器

    对象方法.属性和迭代器 1.构造方法 1)构造方法和一般方法的不同点:当一个对象被创建后,会立即调用构造方法. 2)在Python中创建一个构造方法很容易,只要把init方法的名字从简单的init修改 ...

  9. eclipse及Java常用问题及解决办法汇总

    junit-test 我觉得这点比idea好用,可以直接选中要测试的方法名,右击run as即可 http://www.cnblogs.com/brolanda/p/4532779.html 打开您的 ...

  10. VS2010/MFC字体和文本输出:文本输出

    字体和文本输出:文本输出 本节主要讲解文本输出的方法和实例. 文本输出过程 在文本输出到设备以前,我们需要确定字体.字体颜色和输出的文本内容等信息.Windows窗口的客户区由应用程序管理,所以我们还 ...