博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3015 Disharmony Trees
阅读量:4582 次
发布时间:2019-06-09

本文共 1389 字,大约阅读时间需要 4 分钟。

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

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

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

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

#include 
#include
#include
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.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<
<

转载于:https://www.cnblogs.com/forever97/p/3581136.html

你可能感兴趣的文章
mysql导出数据库和恢复数据库代码
查看>>
走出软件泥潭 第一回 雪上加霜
查看>>
小鸟哥哥博客 For SAE
查看>>
gui编程实践(3)--记事本界面 JMenuBar JMenu
查看>>
App测试方法总结
查看>>
51nod-1228: 序列求和
查看>>
BZOJ1303: [CQOI2009]中位数图
查看>>
2015上海马拉松线上跑感悟-人生如同一场马拉松
查看>>
北航软院2013级C#期末考试部分考题解答
查看>>
CentOS 系统中安装 ArcGIS Server10.1 一些问题及解决
查看>>
asp.net里登陆记住密码
查看>>
【BZOJ】2190 [SDOI2008]仪仗队(欧拉函数)
查看>>
线性规划中的单纯形法与内点法(原理、步骤以及matlab实现)(一)
查看>>
简单DP【p2758】编辑距离
查看>>
Spring Data JPA:关联映射操作
查看>>
JWT入门简介
查看>>
结对编程——吐槽必应词典
查看>>
katalon系列八:Katalon Studio图片识别
查看>>
Spring操作指南-针对JDBC配置声明式事务管理(基于XML)
查看>>
sql server 调优----索引缺失
查看>>