题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3015

题意:给定n组数,每组数有值x和值h,求n组数两两的val的总和。将所有x和所有h分别离散化(不去重)变成x'和h',val(i,j)为abs(x'i-x'j)*min(hi',hj')。

如:

x,    h——>x',h'

10,100——>1,1

50,500——>4,4

20,200——>3,3

20,100——>1,1

思路:只要把n*n优化成n*logn就可以过。

tip1:按照h'的值sort,并动态加点,每次加的点如果是已加点中h'最小的,那么min()中要取的值就为h'

tip2:离散化但是不去重,不需要unique

tip3:关于abs()部分的处理,两棵树状数组,一棵统计数量,一棵统计sum。abs()值为(大于x'的sum-大于x'的数量*x')+(小于x'的数量*x'-小于x'的sum)

tip4:res和sum树状数组均需要开long long

附上代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=1e5+;
int C1[maxn],C2[maxn],n;
int lowbit(int x)
{
return x&-x;
}
void add1(int x,int c)
{
for(;x<=n;x+=lowbit(x))
C1[x]+=c;
}
void add2(int x,int c)
{
for(;x<=n;x+=lowbit(x))
C2[x]+=c;
}
int query1(int x)
{
int res=;
for(;x;x-=lowbit(x))
res+=C1[x];
return res;
};
long long query2(int x)
{
long long res=;
for(;x;x-=lowbit(x))
res+=C2[x];
return res;
}
struct node
{
int x,h;
}p[maxn];
bool cmp(node a,node b)
{
if(a.h==b.h)return a.x>b.x;
else return a.h>b.h;
} int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(C1,,sizeof C1);
memset(C2,,sizeof C2);
int x[maxn]={},h[maxn]={};
for(int i=;i<n;i++)scanf("%d%d",&p[i].x,&p[i].h),x[i]=p[i].x,h[i]=p[i].h;
sort(x,x+n);
sort(h,h+n);
sort(p,p+n,cmp);
long long res=;
for(int i=;i<n;i++)
{
int tmpx=lower_bound(x,x+n,p[i].x)-x+;
int tmph=lower_bound(h,h+n,p[i].h)-h+;
//cout<<tmpx<<" "<<tmph<<endl;
res+=1ll*tmph*(-1ll*tmpx*(query1(n)-query1(tmpx))+1ll*tmpx*query1(tmpx-)+query2(n)-query2(tmpx)-query2(tmpx-));
add1(tmpx,);
add2(tmpx,tmpx);
}
printf("%lld\n",res);
}
return ;
}

poj1990,一道类似的题

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=2e4+;
int n,C1[maxn],C2[maxn],maxp;
struct node
{
int v,place;
}p[maxn];
bool cmp(node a,node b)
{
if(a.v==b.v)return a.place>b.place;
else return a.v>b.v;
}
int lowbit(int x)
{
return x&-x;
}
void add1(int x,int c)
{
for(;x<=maxp;x+=lowbit(x))
C1[x]+=c;
}
void add2(int x,int c)
{
for(;x<=maxp;x+=lowbit(x))
C2[x]+=c;
}
int query1(int x)
{
int res=;
for(;x;x-=lowbit(x))
res+=C1[x];
return res;
}
long long query2(int x)
{
long long res=;
for(;x;x-=lowbit(x))
res+=C2[x];
return res;
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)scanf("%d%d",&p[i].v,&p[i].place),maxp=max(maxp,p[i].place);
sort(p,p+n,cmp);
long long res=;
for(int i=n-;i>=;i--)
{
//cout<<p[i].v<<" "<<p[i].place<<endl;
res+=1ll*p[i].v*(query2(maxp)-query2(p[i].place)-p[i].place*(query1(maxp)-query1(p[i].place))+p[i].place*query1(p[i].place-)-query2(p[i].place-));
add1(p[i].place,);
add2(p[i].place,p[i].place);
//cout<<res<<endl;
}
printf("%lld\n",res);
return ;
}

hdu3015,poj1990树状数组的更多相关文章

  1. poj1990树状数组

    Every year, Farmer John's N (1 <= N <= 20,000) cows attend "MooFest",a social gather ...

  2. hdu3015树状数组 poj1990的离散化版本

    都是一类题目,推导调试比较烦,想出来还是不难的 /* 给定n个点对,按一维升序排序一次,每个点的序号为Di,按二维升序排序一次,每个点的序号为Hi 求sum{w(i,j)} w(i,j)=abs(Di ...

  3. POJ-1990 MooFest---两个树状数组

    题目链接: https://vjudge.net/problem/POJ-1990 题目大意: 一群牛参加完牛的节日后都有了不同程度的耳聋,第i头牛听见别人的讲话,别人的音量必须大于v[i],当两头牛 ...

  4. poj1990两个树状数组

    垃圾poj交不上去 /* 按权值从小到大排序, 两个树状数组维护权值小于等于并且在i左边的点的个数和权值 */ #include<iostream> #include<cstring ...

  5. POJ_1990 MooFest 【树状数组】

    一.题面 POJ1990 二.分析 一个简单的树状数组运用.首先要把样例分析清楚,凑出57,理解一下.然后可以发现,如果每次取最大的v就可以肆无忌惮的直接去乘以坐标差值就可以了,写代码的时候是反着来的 ...

  6. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  7. bzoj1878--离线+树状数组

    这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...

  8. codeforces 597C C. Subsequences(dp+树状数组)

    题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...

  9. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

随机推荐

  1. map的线程安全问题

    为什么HashMap是线程不安全的 总说 HashMap 是线程不安全的,不安全的,不安全的,那么到底为什么它是线程不安全的呢?要回答这个问题就要先来简单了解一下 HashMap 源码中的使用的存储结 ...

  2. XML解析之Jsoup

    操作xml文件 解析(读取):将文档中的数据解读到内存中 写入:将内存中的数据保存到XML文档中.持久化的存储 解析xml的方式 DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树 优点 ...

  3. Go组件学习——Web框架Gin

    以前学Java的时候,和Spring全家桶打好关系就行了,从Spring.Spring MVC到SpringBoot,一脉相承. 对于一个Web项目,使用Spring MVC,就可以基于MVC的思想开 ...

  4. 使用Rider中搭建specflow+xunit+selenium对web页面进行自动化功能测试环境

    运行rider,创建测试解决方案,选择xunit,点击create创建 ​   导入包,由于本人使用chrome浏览器(需先下载好对应的浏览器驱动),所以导入了selenium.webdriver.c ...

  5. 手把手教你用netty撸一个ZkClient

    原文地址: https://juejin.im/post/5dd296c0e51d4508182449a6 前言 有这个想法的缘由是前一阵子突发奇想, 想尝试能不能直接利用js连接到zookeeper ...

  6. vue开发之跨域请求,请求头not allowed by Access-Control-Allow-Headers,后端cookie session值取不到(二)

    原因:你本地的请求ajax的get和post请求:如果你的请求头内放一些可用验证数据Token的时候就会存在跨域请求这是浏览器所不允许的问题: 方案一:后台的接口请求模式都写成jsonp请求,前端去调 ...

  7. Mac 下安装并配置 Tomcat

    1,下载 点击 官网 ,进入下载页面, 2,安装 解压出来,即安装完成. 移动解压后的文件,换个文件目录(方便集中管理),将它改个名字(毕竟名字太长了). 我将其改名为 tomcat9 ,移入资源库目 ...

  8. Redis报错: StackExchange.Redis.RedisServerException: Endpoint 39.105.22.111:7200 serving hashslot 12448 is not reachable at this point of time.

    emmmm……要下班了,简单记录一下. 如果是127.0.0.1:7200报这个错,请移步 https://blog.csdn.net/foreverhot1019/article/details/7 ...

  9. 【论文阅读】Diverse Image-to-Image Translation via Disentangled Representations(ECCV2018 oral)

    目录 相关链接 方法亮点 相关工作 方法细节 实验结果 总结与收获 参考文献 相关链接: 论文:https://arxiv.org/abs/1808.00948 代码:https://github.c ...

  10. HTML,CSS,Javascript,PHP在网站结构中扮演的“角色”

    ①HTML   在网站结构中使用来,展示网页内容的: ②CSS   在网站结构中使用来,美化页面,如字体颜色大小等: ③Javascript(JS)   在网站结构中使用来,让页面动起来,提高浏览体验 ...