这个题给你一堆树,每棵树的位置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. 解决loadrunner录制页面的乱码问题

    以下亲自验证了的:好用.     三步解决loadrunner录制页面的乱码问题 第一步:去lr 的vugen的Tools -> Recoding Options -> Advanced ...

  2. Hadoop(一) HADOOP简介

    1. HADOOP背景介绍 1.1 什么是HADOOP HADOOP是apache旗下的一套开源软件平台 HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 H ...

  3. POJ1966 Cable TV Network

    原题链接 割去点使得无向图不连通,和最小割相似. 我们可以将点转化成边,这样就能跑最小割了. 枚举每两个不能直接到达的点\(S,T\),使得删去一些点(除去这两个点)使得这两个点不连通(若两点能直接到 ...

  4. Django 访问admin提示ViewDoesNotExist at /admin/

    ViewDoesNotExist at /admin/ Could not import django.views.generic.simple.redirect_to. Parent module ...

  5. Python 常用模块之re 正则表达式的使用

    re模块用来使用正则表达式.正则表达式用来对字符串进行搜索的工作.我们最应该掌握正则表达式的查询,更改,删除的功能.特别是做爬虫的时候,re模块就显得格外重要. 1.查询 import re a = ...

  6. 通过代理上网时,qq等应用程序连网出错

    虽然现在基本上都用无线,有线宽带等,但是有时候还是避免不了通过代理上网时,于是就发生浏览器可以正常浏览网页,qq等应用程序连接出错等问题,上网搜了好长时间,    都没解决问题,后来慢慢琢磨(其实是乱 ...

  7. qr 生成二维码

    package com.common; import com.swetake.util.Qrcode; import jp.sourceforge.qrcode.QRCodeDecoder; impo ...

  8. nginx自旋锁

    #include <stdio.h> #include <stdint.h> #include <unistd.h> /* typedef unsigned lon ...

  9. Socket 学习笔记 01 常用函数

    常用方法 创建套接字: socket()    绑定本机端口: bind()    建立连接: connect(),accept()    侦听端口: listen()    数据传输: send() ...

  10. js文件中获取${pageContext.request.contextPath}

    一般从 JSP文件中,可以直接使用 ${pageContext.request.contextPath}非常方便的获得当前页面的路径,用来处理被 Apache2代理之后出现 URL变化的问题,比如增加 ...