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 ...
随机推荐
- visual studio 2017 30天到期,不能输入注册码
官网下载了visual studio 2017后,第一次安装没有登陆,导致只有30天试用期,虽然还在试用期内,但是无法使用注册码永久使用 解决办法: 1.注册一个微软账号,直接百度搜索“微软账号登陆” ...
- centos vncviewer
CentOS6.5 安装vncserver实现图形化访问 一. 安装gnome图形化桌面 #yum groupinstall -y "X Window System" #yum ...
- asp.net web 服务器端全局定时执行任务
web网站里面,需要每隔1分钟,执行一个任务,并且一直保持这个定时执行状态,可以用如下一个方法: 1,Global.asax里面的 Application_Start ,发生在第一次请求网站的时 ...
- Java的反射技术
什么是反射机制 Java的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能调用它的任意属性和方法.这种动态获取信息以及动态调用对象属性和方法的即使称为J ...
- ubuntu安装jre
1)登录java官网,下载jre,并解压,解压后的jre文件夹移动到 /usr/lib/java 路径下 2)配置系统环境变量 JAVA_HOME CLASSPATH PATH 打开/etc/envi ...
- QueryRunner类的八种结果处理集
package cn.jy.demo; import java.sql.Connection; import java.sql.SQLException; import java.util.List; ...
- 【C#】解析C#程序集的加载和反射
目录结构: contents structure [+] 程序集 程序集的加载 发现程序集中的类型 反射对类型成员的常规操作 发现类型的成员 创建类型的实例 绑定句柄减少进程的内存消耗 解析自定义特性 ...
- Django的学习(六)————templates过滤器、Django shell、admin
一.filter: 1.介绍: 写在模板中,属于Django的模板语言. 可以修改模板中的变量,从而显示不同的内容 2.使用: {{ value | filter }},且过滤器可以嵌套使用 < ...
- chattr改变文件属性
Linux chattr命令用于改变文件属性. 这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式: a:让文件或目录仅供附加用途. b:不更新文件或目录的最后存取时间. ...
- Hibernate 的缓存
Hibernate的一级缓存 什么是缓存?? 1 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高. 1.1 把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据 ...