hdu3015树状数组 poj1990的离散化版本
都是一类题目,推导调试比较烦,想出来还是不难的
/*
给定n个点对,按一维升序排序一次,每个点的序号为Di,按二维升序排序一次,每个点的序号为Hi
求sum{w(i,j)}
w(i,j)=abs(Di-Dj)*min(Hi-Hj) 那么将所有的点按照H升序排列,两个树状数组,一个维护区间d的个数,一个维护区间d的总和
每个点的贡献值=树状数组中D小于其的+D大于其的abs 按升序遍历每个点后,将该点在树状数组中删掉
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 100005
struct node {
ll a,b;//x坐标,高度
int num1,num2;//D,H
}t[maxn];
int n;
ll bitc[maxn],bitd[maxn];
int cmpa(node x,node y){return x.a<y.a;}
int cmpb(node x,node y){return x.b<y.b;}
int cmpc(node x,node y){return x.num2<y.num2;}
void add1(int x,int num){
for(int i=x;i<=;i+=i&-i)
bitc[i]+=num;
}
void add2(int x,int num){
for(int i=x;i<=;i+=i&-i)
bitd[i]+=num;
}
ll query1(int x){
ll res=;
for(int i=x;i;i-=i&-i)
res+=bitc[i];
return res;
}
ll query2(int x){
ll res=;
for(int i=x;i;i-=i&-i)
res+=bitd[i];
return res;
}
int main(){
while(scanf("%d",&n)==){
memset(bitc,,sizeof bitc);
memset(bitd,,sizeof bitd);
for(int i=;i<=n;i++) scanf("%lld%lld",&t[i].a,&t[i].b);
sort(t+,t++n,cmpa);//按x坐标升序排列
for(int i=;i<=n;i++){
if(i==) t[i].num1=i;
else if(t[i].a==t[i-].a) t[i].num1=t[i-].num1;
else t[i].num1=i;
}
int max=t[n].num1;
sort(t+,t++n,cmpb);//按高度升序排列
for(int i=;i<=n;i++){
if(i==) t[i].num2=i;
else if(t[i].b==t[i-].b) t[i].num2=t[i-].num2;
else t[i].num2=i;
}
sort(t+,t++n,cmpc);//按照h升序排列
for(int i=;i<=n;i++){add1(t[i].num1,);add2(t[i].num1,t[i].num1);} ll ans=;
for(int i=;i<n;i++){//最后一个点没有贡献度
ll tmp1=query1(t[i].num1-);//第i个点严格左边的
ll tmp2=query2(t[i].num1-);
ll tmp3=query1(t[i].num1);
ll tmp4=query2(t[i].num1);
ans+=t[i].num2*(t[i].num1*tmp1-tmp2);
ans+=t[i].num2*(query2(max+)-tmp4-t[i].num1*(query1(max+)-tmp3));//
add1(t[i].num1,-);
add2(t[i].num1,-t[i].num1);
}
printf("%lld\n",ans);
}
}
hdu3015树状数组 poj1990的离散化版本的更多相关文章
- HDU 4417 - Super Mario ( 划分树+二分 / 树状数组+离线处理+离散化)
题意:给一个数组,每次询问输出在区间[L,R]之间小于H的数字的个数. 此题可以使用划分树在线解决. 划分树可以快速查询区间第K小个数字.逆向思考,判断小于H的最大的一个数字是区间第几小数,即是答案. ...
- Educational Codeforces Round 10 D. Nested Segments 【树状数组区间更新 + 离散化 + stl】
任意门:http://codeforces.com/contest/652/problem/D D. Nested Segments time limit per test 2 seconds mem ...
- Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1539 Solved: 665[Submit][Status][Di ...
- hdu5542 The Battle of Chibi【树状数组】【离散化】
The Battle of Chibi Time Limit: 6000/4000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Othe ...
- HDU 5877 Weak Pair DFS + 树状数组 + 其实不用离散化
http://acm.hdu.edu.cn/listproblem.php?vol=49 给定一颗树,然后对于每一个节点,找到它的任何一个祖先u,如果num[u] * num[v] <= k.则 ...
- P1774 最接近神的人_NOI导刊2010[树状数组 逆序对 离散化]
题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的 ...
- cf1042d 树状数组逆序对+离散化
/* 给定一个数组,要求和小于t的段落总数 求前缀和 dp[i]表示以第i个数为结尾的小于t的段落总数,sum[i]-sum[l]<t; sum[i]-t<sum[l],所以只要找到满足条 ...
- [luoguP3402] 最长公共子序列(DP + 离散化 + 树状数组)
传送门 比 P1439 排列LCS问题,难那么一点点,只不过有的元素不是两个串都有,还有数据范围变大,树状数组得打离散化. 不过如果用栈+二分的话还是一样的. ——代码 #include <cs ...
- 扫描线+树状数组——cf1191F
把所有点离散化,虚构一根扫描线从上往下扫,每行的点从左往右算贡献,开一个树状数组维护每个离散化后的x坐标是否已经有点 扫描到一个点时,先把这个点更新到树状数组里,每个点的贡献是它左边的所有点数*到它相 ...
随机推荐
- grafana配置
grafana配置 官网介绍:http://docs.grafana.org/installation/configuration/ 以deb或者rpm安装的,则默认的配置文件是/etc/grafan ...
- ElasticSearch 例子
ElasticSearch是一个接近实时的搜索平台,它利用Lucese进行文档索引. 本文会写个可以运行的简单例子,方便大家上手,日后深入了解. 需要引入maven依赖 <dependency& ...
- 循环内的switch中break和continue使用区别
首先看下break和continue的使用方法. break语句在循环和switch语句中使用,用于终止最近的封闭代码块,如果在嵌套循环中,则只终止最近的循环. continue语句在循环中使用,不能 ...
- UVALive 4725 Airport(二分)
题目链接 题意 机场有两种飞机,每小时一些飞机到达,每小时安排一架飞机起航.求任意时刻中两种飞机数目的最大值的最小值. 分析 首先肯定是二分来做.这里的难点在于如何判断飞机数目是否合法.一开始忽略了某 ...
- LaTeX简历模板
%# -*- coding:utf-8 -*- %% start of file `template_en.tex'. %% Copyright 2006-1008 Xavier Danaux (xd ...
- 在Eclipse中利用maven整合搭建ssm框架
首先说明用到的框架: spring + springMVC + mybatis 构建工具:maven 开发工具:eclipse 开发环境:win10 java版本:jdk1.8 ...
- Kettle 中转换(transformation)的执行过程
1,Spoon.java的main方法是整个Kettle运行的入口.当打开Kettle的设计器界面后,可以在其中设计作业和转换.这里讨论转换的执行过程. 2,设计好一个转换后,转换保存的本地文件是 . ...
- linux 命令收集 阿里云nginx升级等 查看磁盘空间 版本等
—————————————————— 查磁盘 df -h此命令直观的呈现出磁盘大小有多少Gdf -hl文件系统 容量 已用 可用 已用% 挂载点/dev/hdb2 75G 75G 0 100% /就是 ...
- 逆向安全基础之IDA使用简介
转载:http://m.blog.csdn.net/ilnature2008/article/details/54912854 IDA简介 IDA是业界一个功能十分强大的反汇编工具,是安全渗透人员进行 ...
- pygame(class类)调用视图的方法
以下将介绍pygame精灵动画的基础知识,希望对大家有帮助:1.在此,精灵类必须继承pygame.sprite.Sprite并初始化pygame.sprite.Sprite.__init__(self ...