BZOJ2675 : Bomb
首先通过不断翻转坐标系,假设三个点以横坐标为第一关键字,纵坐标为第二关键字排序后A在B前面,B在C前面。
那么只需要处理以下两种情况:
1.B的纵坐标在AC之间,这时三个点的距离和为$2((x_C+y_C)-(x_A+y_A))$。
可以用线段树处理出每个点作为B时$x_A+y_A$以及$x_C+y_C$的最值,然后更新答案即可。
2.B的纵坐标不超过A的纵坐标,这时三个点的距离和为$2((x_C+y_C)-x_A-y_B)$。
还是考虑枚举B,需要维护它左边每个A与右边每个C合并的答案。
于是用一棵线段树维护A集合,从n到1依次计算。
假设现在处理的是点B,那么先把B从A中删除,然后查询答案,再将B加入C集合中,也就是在A集合里进行区间更新。
时间复杂度$O(n\log n)$。
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100010,M=262150,inf=1000000000;
int n,i,ansmx,ansmn=inf,c[N],d[N],e[N],fmx[N],fmn[N];
struct P{int x,y;}a[N],b[N];
inline bool cmp(const P&a,const P&b){return a.x==b.x?a.y<b.y:a.x<b.x;}
inline bool cmpb(const P&a,const P&b){return a.x<b.x;}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void umax(int&a,int b){if(a<b)a=b;}
inline void umin(int&a,int b){if(a>b)a=b;}
inline int findl(int x){
int l=1,r=n,mid,t;
while(l<=r)if(b[mid=(l+r)>>1].x>=x)r=(t=mid)-1;else l=mid+1;
return t;
}
inline int findr(int x){
int l=1,r=n,mid,t;
while(l<=r)if(b[mid=(l+r)>>1].x<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
namespace Sub1{
struct Node{int mx,mn;}T[M];
void build(int x,int a,int b){
T[x].mx=-inf,T[x].mn=inf;
if(a==b)return;
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
}
void ins(int x,int a,int b,int c,int p){
umax(T[x].mx,p),umin(T[x].mn,p);
if(a==b)return;
int mid=(a+b)>>1;
if(c<=mid)ins(x<<1,a,mid,c,p);else ins(x<<1|1,mid+1,b,c,p);
}
int askmx(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return T[x].mx;
int mid=(a+b)>>1,t=-inf;
if(c<=mid)t=askmx(x<<1,a,mid,c,d);
if(d>mid)umax(t,askmx(x<<1|1,mid+1,b,c,d));
return t;
}
int askmn(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return T[x].mn;
int mid=(a+b)>>1,t=inf;
if(c<=mid)t=askmn(x<<1,a,mid,c,d);
if(d>mid)umin(t,askmn(x<<1|1,mid+1,b,c,d));
return t;
}
}
namespace Sub2{
struct Node{int mxx,mnx,mxv,mnv,mxt,mnt;}T[M];
inline void tagmx(int x,int p){
umax(T[x].mxv,T[x].mxx+p);
umax(T[x].mxt,p);
}
inline void tagmn(int x,int p){
umin(T[x].mnv,T[x].mnx+p);
umin(T[x].mnt,p);
}
inline void pb(int x){
tagmx(x<<1,T[x].mxt);
tagmx(x<<1|1,T[x].mxt);
tagmn(x<<1,T[x].mnt);
tagmn(x<<1|1,T[x].mnt);
T[x].mxt=-inf,T[x].mnt=inf;
}
inline void up(int x){
T[x].mxx=max(T[x<<1].mxx,T[x<<1|1].mxx);
T[x].mnx=min(T[x<<1].mnx,T[x<<1|1].mnx);
T[x].mxv=max(T[x<<1].mxv,T[x<<1|1].mxv);
T[x].mnv=min(T[x<<1].mnv,T[x<<1|1].mnv);
}
void build(int x,int a,int b){
T[x].mxt=-inf,T[x].mnt=inf;
if(a==b){
T[x].mxx=T[x].mnx=e[a];
T[x].mxv=-inf,T[x].mnv=inf;
return;
}
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b),up(x);
}
void del(int x,int a,int b,int c){
if(a==b){
T[x].mxx=T[x].mxv=-inf;
T[x].mnx=T[x].mnv=inf;
return;
}
pb(x);
int mid=(a+b)>>1;
if(c<=mid)del(x<<1,a,mid,c);else del(x<<1|1,mid+1,b,c);
up(x);
}
void change(int x,int a,int b,int c,int d,int p){
if(c<=a&&b<=d){
tagmx(x,p);
tagmn(x,p);
return;
}
pb(x);
int mid=(a+b)>>1;
if(c<=mid)change(x<<1,a,mid,c,d,p);
if(d>mid)change(x<<1|1,mid+1,b,c,d,p);
up(x);
}
int askmx(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return T[x].mxv;
pb(x);
int mid=(a+b)>>1,t=-inf;
if(c<=mid)t=askmx(x<<1,a,mid,c,d);
if(d>mid)umax(t,askmx(x<<1|1,mid+1,b,c,d));
return up(x),t;
}
int askmn(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return T[x].mnv;
pb(x);
int mid=(a+b)>>1,t=inf;
if(c<=mid)t=askmn(x<<1,a,mid,c,d);
if(d>mid)umin(t,askmn(x<<1|1,mid+1,b,c,d));
return up(x),t;
}
}
void solve(){
for(sort(a+1,a+n+1,cmp),i=1;i<=n;i++)b[i].x=a[i].y,b[i].y=i;
for(sort(b+1,b+n+1,cmpb),i=1;i<=n;i++)c[i]=findl(a[i].y),d[b[i].y]=i;
for(i=1;i<=n;i++)e[d[i]]=-a[i].x;
for(Sub1::build(1,1,n),i=1;i<=n;i++){
fmx[i]=Sub1::askmx(1,1,n,1,c[i]);
fmn[i]=Sub1::askmn(1,1,n,1,c[i]);
Sub1::ins(1,1,n,c[i],-a[i].x-a[i].y);
}
for(Sub1::build(1,1,n),i=n;i;i--){
umax(ansmx,Sub1::askmx(1,1,n,c[i],n)+fmx[i]);
umin(ansmn,Sub1::askmn(1,1,n,c[i],n)+fmn[i]);
Sub1::ins(1,1,n,c[i],a[i].x+a[i].y);
}
for(Sub2::build(1,1,n),i=n;i;i--){
Sub2::del(1,1,n,d[i]);
umax(ansmx,Sub2::askmx(1,1,n,c[i],n)-a[i].y);
umin(ansmn,Sub2::askmn(1,1,n,c[i],n)-a[i].y);
Sub2::change(1,1,n,1,findr(a[i].y),a[i].x+a[i].y);
}
}
int main(){
for(read(n),i=1;i<=n;i++)read(a[i].x),read(a[i].y);
solve();
for(i=1;i<=n;i++)a[i].x*=-1,a[i].y*=-1;
solve();
for(i=1;i<=n;i++)a[i].x*=-1;
solve();
for(i=1;i<=n;i++)a[i].x*=-1,a[i].y*=-1;
solve();
return printf("%d\n%d",ansmx*2,ansmn*2),0;
}
BZOJ2675 : Bomb的更多相关文章
- HDU3555 Bomb[数位DP]
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- Leetcode: Bomb Enemy
Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...
- HDU 5934 Bomb(炸弹)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- hdu 3622 Bomb Game(二分+2-SAT)
Bomb Game Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- Bomb
Description The counter-terrorists found a time bomb in the dust. But this time the terrorists impro ...
- CF 363B One Bomb(枚举)
题目链接: 传送门 One Bomb time limit per test:1 second memory limit per test:256 megabytes Description ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- [HDU3555]Bomb
[HDU3555]Bomb 试题描述 The counter-terrorists found a time bomb in the dust. But this time the terrorist ...
- hdu 5934 Bomb
Bomb Problem Description There are N bombs needing exploding.Each bomb has three attributes: explodi ...
随机推荐
- Linux下安装配置MongoDB 3.0.x 版本数据库
说明: 操作系统:CentOS 5.X 64位 IP地址:192.168.21.128 实现目的: 安装配置MongoDB数据库 具体操作: 一.关闭SElinux.配置防火墙 1.vi /etc/s ...
- 安装 openSUSE Leap 42.1 之后要做的 8 件事
导读 openSUSE Leap 确实是个巨大的飞跃,它允许用户运行一个和 SUSE Linux 企业版拥有同样基因的发行版.和其它系统一样,为了实现最佳的使用效果,在使用它之前需要做些优化设置. 下 ...
- 极客教学:如何使用树莓派击落&劫持无人机
本教程的目的是帮助大家理解如何研究未受保护的无线通信的安全风险所在,同时我们希望大家不要对技术进行滥用.我们这里采用的例子是一个流行的无人机模型:Parrot AR.Drone 2.0. 四轴无人机能 ...
- Heap(堆)和stack(栈)有的区别是什么。
java的内存分为两类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个 ...
- 【Other】千字文 硬笔 楷书 字帖
<千字文>是我国最优秀的一篇训蒙教材,用一千个汉字勾划出一部完整的中国文化史的基本轮廓,代表了中国传统教育启蒙阶段的最高水平.<千字文>通篇首尾连贯,音韵谐美,读起来朗朗上口, ...
- 使用clssneme改变图片或样式
<title>使用className改变样式</title> <style type="text/css"> li{ font-size: 12 ...
- Selenium webdriver 学习总结-元素定位
Selenium webdriver 学习总结-元素定位 webdriver提供了丰富的API,有多种定位策略:id,name,css选择器,xpath等,其中css选择器定位元素效率相比xpath要 ...
- iOS tableview 选中Cell后的背景颜色和文字颜色
做下记录,备忘 改文字颜色其实是UILabel的属性,改背景颜色是cell的属性,都和tableview无关. cell.textLabel.textColor = BAR_COLOR; cell.t ...
- mysql varchar
2013年9月13日 14:58:43 MYSQL的varchar数据类型 先说结论: 如果设置字段长度为30,字符编码为utf8,那么一个汉字算一个字符,一个数字算一个字符,一个字母也算一个字符 版 ...
- BestCoder12 1001.So easy(hdu 5058) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5058 (格式有点问题,为了方便阅读---整个复制下来吧) 题目意思:给出两个长度都为 n 的集合你,问 ...