hdu 3015
这个题给你一堆树,每棵树的位置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的更多相关文章
- Disharmony Trees HDU - 3015
Disharmony Trees HDU - 3015 One day Sophia finds a very big square. There are n trees in the square. ...
- 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) 求出 ...
- HDU 3015 Disharmony Trees
题解:在路边有一行树,给出它们的坐标和高度,先按X坐标排序.记录排名,记为rankx,再按它们的高度排序,记录排名,记为rankh.两颗树i,j的差异度为 fabs(rankx[i]-rankx[j] ...
- hdu 3015 Disharmony Trees (离散化+树状数组)
Disharmony Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 3015 Disharmony Trees 【 树状数组 】
题意:给出n棵树,给出横坐标x,还有它们的高度h,先按照横坐标排序,则它们的横坐标记为xx, 再按照它们的高度排序,记为hh 两颗树的差异度为 abs(xx[i] - xx[j]) * min(hh[ ...
- Disharmony Trees HDU - 3015 树状数组+离散化
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using ...
- HDU题解索引
HDU 1000 A + B Problem I/O HDU 1001 Sum Problem 数学 HDU 1002 A + B Problem II 高精度加法 HDU 1003 Maxsu ...
- [欧拉回路] hdu 3018 Ant Trip
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3018 Ant Trip Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5643 King's Game 打表
King's Game 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5643 Description In order to remember hi ...
随机推荐
- iOS.OpenSource.PopularProject
1. Core Plot Core Plot is a plotting framework for OS X and iOS. It provides 2D visualization of dat ...
- gdal source code c++ make windows
下载源码 GDAL源代码下载地址:http://trac.osgeo.org/gdal/wiki/DownloadSource,或者安装svn从源代码服务器下载,svn地址是:http://svn.o ...
- Linux下查看系统启动 、运行以及安装时间
1.uptime命令 例子显示已启动13天 当前用户一个 [root@localhost-live version-build-related]# uptime :: up days, :, use ...
- Spring ApplicationContext(一)初始化过程
Spring 容器 ApplicationContext(一)初始化过程 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) ...
- mysql 查询 所有 父节点 单表
SELECT T2.* FROM ( SELECT @r AS _id, ( SELECT @r := parent_id FROM tp_module_rel WHERE REL_ID = _id ...
- windows下忘记mysql的root密码
1.停止mysql 2.命令行启动mysqlmysqld --defaults-file="c:\mysql\mysql server 5.1\my.ini" --console ...
- 前端之javascript的DOM对象和标签
一 DOM对象介绍 什么是HTML DOM 1.1 HTML Document Object Model(文档对象模型) 1.2 HTML DOM 定义了访问和操作HTML文档的标准方法. 1.3 H ...
- windows下Oracle数据库完全删除
1.1 停止所有oracle的服务 1.2 删除安装路径 app及其下所有文件 1.3 删除注册表 regedit 进入 在下列列表中找到与oracle相关的注册表项删除 1.HKEY_L ...
- CAS 界面根据不同的域名显示不同的界面
概要 在实际需求中,客户想通过不同的域名显示不同的登录界面,比如输入 manage.aps.cn 显示运维管理登录,business.aps.cn 显示业务管理登录. 实现方法 1.准备两套登录UI ...
- 实习番外篇:解决C语言使用Makefile无法实现更好的持续集成问题
工作中遇见的一个问题,提供项目源代码的情况下,希望对项目进行持续集成,达到一个C项目增量编译的效果.原本第一天是想通过模拟Makefile执行步骤来实现整个过程的,但是事实上发现整个Makefile显 ...