这个题给你一堆树,每棵树的位置x和高度h都给你

f[i]代表这棵树的位置排名,s[i]代表这棵树的高度排名

问你任意两棵树的(f[i] - f[j])*min(s[i],s[j])和

(f[i]-f[i-1])*min(s[i],s[i-1]) + (f[i]-f[i-2])*min(s[i],s[i-2])

首先看看暴力,肯定过不去,毕竟n2复杂度

看这个式子,其实比s[i]大的那么多项都能合并

合并成 ((f[i] - f[i-1])+ (f[i] - f[i-2]) +.....)*s[i]

所以只要在尽快的时间内求出(f[i] - f[i-1] + f[i] - f[i-2] ........)

f[i]是第i棵数的坐标排名

基本就是区间求和     求出小于f[i]的有多棵树   求出小于f[i]的树的坐标和

创建两个树状数组,非别维护坐标和 and 前面树的数量

复杂度就是nlogn了

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e6+;
struct node
{
long long x,h;
int p1,p2;
} arr[maxn];
int c[maxn];
int d[maxn];
int n;
bool cmp2(node a,node b);
bool cmp1(node a,node b);
long long getsumd(int i);
long long getsumc(int i);
void addc(long long i,long long j);
void addd(long long i,long long j);
int main()
{
int m,i,j,k;
while (scanf("%d",&n) != EOF)
{
memset(c, , sizeof(c));
memset(d, , sizeof(d));
for(i=;i<=n;++i)
scanf("%lld%lld",&arr[i].x,&arr[i].h);
sort(arr+,arr+n+,cmp1);
arr[].p1 = ;
for(i=;i<=n;++i)
{
if(arr[i].x == arr[i-].x)
arr[i].p1 = arr[i-].p1;
else
arr[i].p1 = i;
}
sort(arr+,arr++n,cmp2);
arr[].p2 = ;
for(i=;i<=n;++i)
{
if(arr[i].h == arr[i-].h)
arr[i].p2 = arr[i-].p2;
else
arr[i].p2 = i;
}
for(i=;i<=n;++i)
{
addc(arr[i].p1,arr[i].p1);
addd(arr[i].p1, );
}
long long maxnn=;
for(i=;i<=n;++i)
{
long long k1 = (getsumd(arr[i].p1))*arr[i].p1 - getsumc(arr[i].p1);
//printf("%lld %lld\n",getsumc(n)-getsumc(arr[i].p1),(getsumd(n) - getsumd(arr[i].p1))*arr[i].p1);
k1 += (getsumc(n)-getsumc(arr[i].p1)) - (getsumd(n) - getsumd(arr[i].p1))*arr[i].p1; maxnn+=k1*arr[i].p2;
addc(arr[i].p1, -arr[i].p1);
addd(arr[i].p1, -);
}
printf("%lld\n",maxnn);
}
}
long long lowbit(long long k)
{
return k&(-k);
}
void addc(long long i,long long j)
{
while(i<=n)
{
c[i]+=j;
i+=lowbit(i);
}
}
void addd(long long i,long long j)
{
while(i<=n)
{
d[i]+=j;
i+=lowbit(i);
}
}
long long getsumc(int i)
{
long long su = ;
while(i>)
{
su+=c[i];
i-=lowbit(i);
}
return su;
}
long long getsumd(int i)
{
long long su = ;
while(i>)
{
su+=d[i];
i-=lowbit(i);
}
return su;
}
bool cmp1(node a,node b)
{
if(a.x<b.x)
return true;
return false;
}
bool cmp2(node a,node b)
{
if(a.h<b.h)
return true;
return false;
}

hdu 3015的更多相关文章

  1. Disharmony Trees HDU - 3015

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

  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

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

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

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

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

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

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

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

  7. HDU题解索引

    HDU 1000 A + B Problem  I/O HDU 1001 Sum Problem  数学 HDU 1002 A + B Problem II  高精度加法 HDU 1003 Maxsu ...

  8. [欧拉回路] hdu 3018 Ant Trip

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3018 Ant Trip Time Limit: 2000/1000 MS (Java/Others) ...

  9. HDU 5643 King's Game 打表

    King's Game 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5643 Description In order to remember hi ...

随机推荐

  1. iOS.OpenSource.PopularProject

    1. Core Plot Core Plot is a plotting framework for OS X and iOS. It provides 2D visualization of dat ...

  2. gdal source code c++ make windows

    下载源码 GDAL源代码下载地址:http://trac.osgeo.org/gdal/wiki/DownloadSource,或者安装svn从源代码服务器下载,svn地址是:http://svn.o ...

  3. Linux下查看系统启动 、运行以及安装时间

    1.uptime命令  例子显示已启动13天 当前用户一个 [root@localhost-live version-build-related]# uptime :: up days, :, use ...

  4. Spring ApplicationContext(一)初始化过程

    Spring 容器 ApplicationContext(一)初始化过程 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) ...

  5. mysql 查询 所有 父节点 单表

    SELECT T2.* FROM ( SELECT @r AS _id, ( SELECT @r := parent_id FROM tp_module_rel WHERE REL_ID = _id ...

  6. windows下忘记mysql的root密码

    1.停止mysql 2.命令行启动mysqlmysqld --defaults-file="c:\mysql\mysql server 5.1\my.ini" --console ...

  7. 前端之javascript的DOM对象和标签

    一 DOM对象介绍 什么是HTML DOM 1.1 HTML Document Object Model(文档对象模型) 1.2 HTML DOM 定义了访问和操作HTML文档的标准方法. 1.3 H ...

  8. windows下Oracle数据库完全删除

    1.1   停止所有oracle的服务 1.2   删除安装路径 app及其下所有文件 1.3   删除注册表 regedit 进入 在下列列表中找到与oracle相关的注册表项删除 1.HKEY_L ...

  9. CAS 界面根据不同的域名显示不同的界面

    概要 在实际需求中,客户想通过不同的域名显示不同的登录界面,比如输入 manage.aps.cn 显示运维管理登录,business.aps.cn 显示业务管理登录. 实现方法 1.准备两套登录UI ...

  10. 实习番外篇:解决C语言使用Makefile无法实现更好的持续集成问题

    工作中遇见的一个问题,提供项目源代码的情况下,希望对项目进行持续集成,达到一个C项目增量编译的效果.原本第一天是想通过模拟Makefile执行步骤来实现整个过程的,但是事实上发现整个Makefile显 ...