BZOJ 2735: 世博会 主席树+切比雪夫距离转曼哈顿距离
2735: 世博会
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 124 Solved: 51
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 6 -3 2
2 7 -1 3
1 4
2 3
Sample Output
9.00
样例说明
对于第一个询问,平均物品的两个属性可以是1和2差异度为max(0,0)+max(5,5)+max(4,3)+max(1,1)=10对于第二个
询问,平均物品的两个属性可以是6和7差异度为max(0,0)+max(9,8)=9
Solution
切比雪夫距离:每一维差绝对值的最大值 $max\{|x_i-x_j|,|y_i-y_j|\}$
曼哈顿距离:每一维差绝对值之和 $|x_i-x_j|+|y_i-y_j|$
二维切比雪夫距离转曼哈顿距离:把坐标系旋转一下,然后再拉伸下。$(x,y)->(\frac{1}{2}(x-y),\frac{1}{2}(x+y))$
想法:将(A,B)当成二维坐标。然后再转换为(A-B,A+B)。问题变成最小化$\sum_{i=L}^{R} {|A_i-A_0|+|B_i-B_0|} $。每一维是独立的,并且每一维选中位数是最优的之一。所以用主席树维护一下查第K大,前\后缀和。
Code $O(n \log n)$
#include < cstdio >
#include < algorithm > #define gec getchar
#define FILE(F) freopen(F".in","r",stdin),freopen(F".out","w",stdout)
#define DEBUG fprintf(stderr,"Passing [%s] in Line (%d)\n",__FUNCTION__,__LINE__) typedef long long ll;
template < typename T >
inline void read(T &x)
{
x=0;bool f=0; char c=gec();
for(;c<'0'||c>'9';c=gec())f=(c=='-');
for(;c>='0'&&c<='9';c=gec())x=x*10+c-'0';
x=f?-x:x;
} const int MAXN(100010);
int n,q,A[MAXN],B[MAXN],X[MAXN],Y[MAXN]; struct AXLE
{
int a[MAXN],up;
void ins(int x){a[++up]=x;}
void build()
{
std::sort(a+1,a+1+up);
int _up=1;
for(int i=2;i<=up;i++)if(a[i]!=a[i-1])a[++_up]=a[i];
up=_up;
}
int Find(int x)
{
int l=1,r=up,mid,id=1;
while(l<=r)if(a[mid=(l+r)>>1]<=x)l=mid+1,id=mid;else r=mid-1;
return id;
}
}axle; namespace ChairMan_Tree
{
const int MAX_L(2000010);
struct CMT
{
int nx[MAX_L][2],Siz[MAX_L]; ll Sum[MAX_L];
int root[MAXN],stot,Val[MAXN],N; void update(int k)
{Sum[k]=Sum[nx[k][0]]+Sum[nx[k][1]];
Siz[k]=Siz[nx[k][0]]+Siz[nx[k][1]];} void modfiy(int&k,int k2,int L,int R,int x)//val[x]++;
{
if(!k)k=++stot,Sum[k]=Sum[k2],Siz[k]=Siz[k2];
if(L==R){Sum[k]+=Val[x];Siz[k]++; return ;}
int MID=(L+R)>>1;
if(x<=MID)modfiy(nx[k][0],nx[k2][0],L,MID,x),nx[k][1]=nx[k2][1];
else modfiy(nx[k][1],nx[k2][1],MID+1,R,x),nx[k][0]=nx[k2][0];
update(k);
} ll Que(int k1,int k2,int Rank)//查询区间第K大以及前\后缀和
{
int L=1,R=N,MID,Siz_L=0,Siz_R=0;
ll Sum_L=0,Sum_R=0;
while(L!=R)
{
MID=(L+R)>>1;
// fprintf(stderr,"%d %d %d\n",L,R,Rank);
// fprintf(stderr,"%d\n",Siz[nx[k1][0]]-Siz[nx[k2][0]]);
if(Siz[nx[k1][0]]-Siz[nx[k2][0]]<Rank)
Siz_L+=Siz[nx[k1][0]]-Siz[nx[k2][0]],Sum_L+=Sum[nx[k1][0]]-Sum[nx[k2][0]],
// fprintf(stderr,"%d %d %lld\n",L,MID,Sum[nx[k1][0]]-Sum[nx[k2][0]]),
L=MID+1,Rank-=Siz[nx[k1][0]]-Siz[nx[k2][0]],k1=nx[k1][1],k2=nx[k2][1];
else
Siz_R+=Siz[nx[k1][1]]-Siz[nx[k2][1]],Sum_R+=Sum[nx[k1][1]]-Sum[nx[k2][1]],
R=MID,k1=nx[k1][0],k2=nx[k2][0];
}
// fprintf(stderr,"%lld %d %lld %d %d %d\n",Sum_L,Siz_L,Sum_R,Siz_R,L,Val[L]);
return (ll)Siz_L*Val[L]-Sum_L+Sum_R-(ll)Siz_R*Val[L];
} }A_Tree,B_Tree; }using namespace ChairMan_Tree; void Pretreat()
{
for(int i=1;i<=n;i++)axle.ins(A[i]); axle.build();
for(int i=1;i<=n;i++)A[i]=axle.Find(A[i]);
A_Tree.N=axle.up; for(int i=1;i<=A_Tree.N;i++)A_Tree.Val[i]=axle.a[i];
for(int i=1;i<=n;i++)A_Tree.modfiy(A_Tree.root[i],A_Tree.root[i-1],1,A_Tree.N,A[i]);
axle.up=0;
for(int i=1;i<=n;i++)axle.ins(B[i]); axle.build();
for(int i=1;i<=n;i++)B[i]=axle.Find(B[i]);
B_Tree.N=axle.up; for(int i=1;i<=B_Tree.N;i++)B_Tree.Val[i]=axle.a[i];
for(int i=1;i<=n;i++)B_Tree.modfiy(B_Tree.root[i],B_Tree.root[i-1],1,B_Tree.N,B[i]);
} int main()
{
#ifndef ONLINE_JUDGE
FILE("C");
#endif
read(n);read(q);
for(int i=1;i<=n;i++)read(X[i]);
for(int i=1;i<=n;i++)read(Y[i]);
for(int i=1;i<=n;i++)A[i]=X[i]-Y[i],B[i]=X[i]+Y[i];
Pretreat();
for(int i=1,L,R;i<=q;i++)
{
read(L);read(R);
ll Ans_A=A_Tree.Que(A_Tree.root[R],A_Tree.root[L-1],(R-L+2)>>1);
ll Ans_B=B_Tree.Que(B_Tree.root[R],B_Tree.root[L-1],(R-L+2)>>1);
printf("%.2lf\n",(Ans_A+Ans_B)*0.5);
}
return 0;
}
BZOJ 2735: 世博会 主席树+切比雪夫距离转曼哈顿距离的更多相关文章
- BZOJ 3170 松鼠聚会(切比雪夫距离转曼哈顿距离)
题意 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. 思路 题目 ...
- BZOJ 3524 Couriers | 主席树
BZOJ 3524 Couriers 题意 求一个区间内出现超过区间长度的一半的数,如果没有则输出0. 题解 我可能太菜了吧--这道题愣是没想出来-- 维护权值主席树,记录每个数都出现过多少次: 查询 ...
- bzoj 3653 谈笑风生 —— 主席树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3653 对于一个 (a,b,c),分成 b 是 a 的祖先和 b 在 a 子树里两部分: 第一 ...
- bzoj 2588 树上主席树
主席树上树,对于每个节点,继承其父亲的,最后跑f[x]+f[y]-f[lca]-f[fa[lca]] 去重竟然要减一,我竟然不知道?? #include<cstdio> #include& ...
- bzoj 2653: middle (主席树+二分)
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2522 Solved: 1434[Submit][Status][Disc ...
- BZOJ - 2809 dispatching 主席树+dfs序
在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同时增强忍者们的 ...
- BZOJ.3170.[TJOI2013]松鼠聚会(切比雪夫距离转曼哈顿距离)
题目链接 将原坐标系每个点的坐标\((x,y)\)变为\((x+y,x-y)\),则原坐标系中的曼哈顿距离等于新坐标系中的切比雪夫距离. 反过来,将原坐标系每个点的坐标\((x,y)\)变为\((\f ...
- BZOJ 3956: Count 主席树 可持久化线段树 单调栈
https://www.lydsy.com/JudgeOnline/problem.php?id=3956 从描述可以得到性质: 每个好点对 ( 除了差值为1的好点对 ) 中间的数 ( i , j ) ...
- bzoj 2653 middle(主席树)
题面:https://vjudge.net/problem/HYSBZ-2653 博客:https://blog.csdn.net/litble/article/details/78984846 这个 ...
随机推荐
- P1060 开心的金明(动态规划背包问题)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱 ...
- POJ 3659 Cell Phone Network 最小支配集模板题(树形dp)
题意:有以个 有 N 个节点的树形地图,问在这些顶点上最少建多少个电话杆,可以使得所有顶点被覆盖到,一个节点如果建立了电话杆,那么和它直接相连的顶点也会被覆盖到. 分析:用最少的点覆盖所有的点,即为求 ...
- 1065. A+B and C (64bit) (20)
Given three integers A, B and C in [-263, 263], you are supposed to tell whether A+B > C. Input S ...
- hdu1016 Prime Ring Problem(DFS)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- nginx编译报错
[root@vm_0_2_centos nginx-1.12.2]# ./configure --prefix=/application/nginx-1.12.2 --user=www --group ...
- Windows10上安装OpenStack
1. 启动Hyper-V 2. 在Hyper-V内安装Ubuntu 这两部可以参考http://www.cnblogs.com/jimmy-y/p/5328306.html(Ubuntu16类似) 3 ...
- 9.JSP进阶
1.JSP内置对象 JSP容器在_jspService()方法中声明并初始化9个内置对象. 名称 作用 接口/类 out 客户端打开的输出流 javax.servlet.jsp.JspWriter 接 ...
- springMvc使用restful风格
转载:https://blog.csdn.net/weide_java/article/details/53793769 1,REST架构师一个抽象的概念,目前主要是基于HTTP协议实现,其目的是为了 ...
- Windows下使用pip安装Python模块
打开cmd窗口: 找到pip安装路径: 拖动pip.exe到命令行窗口: 空格并输入“install 包名”,回车. ========================================= ...
- Linux 磁盘管理基础命令df,du,fdisk,mke2fs
1.df:查看已挂载磁盘的总容量,使用容量和剩余容量等,默认以KB位单位显示 文件系统 容量 已用 可用 已用百分比 挂载点 df常用选项-i,-h,-k,-m ...