题目链接

题目为某次雅礼集训...


对于\(\max\{a-A_i,\ A_i-a,\ b-B_i,\ B_i-b\}\),令\(x_1=\frac{a+b}{2},\ y_1=\frac{a-b}{2},\ x_2=\frac{A_i+B_i}{2},\ y_2=\frac{A_i-B_i}{2}\),那么\(\max\)就可以写成\(\max\{x_1-x_2+y_1-y_2,\ -(x_1-x_2)-(y_1-y_2),\ x_1-x_2-(y_1-y_2),\ -(x_1-x_2)+y_1-y_2\}\)。

注意到两项的正负都取到了,我们就可以写成\(\pm(x_1-x_2)\pm(y_1-y_2)=|x_1-x_2|+|y_1-y_2|\)。两项是独立的了,我们可以分别算。

\(x_2,y_2\)是确定的,现在要确定一个\(x_1,y_1\),使得\(\sum|x_1-x_{2,i}|+\sum|y_1-y_{2,i}|\)最小(确定出\(x_1,y_1\)我们显然可以确定出\(a,b\))。

这个问题...考虑一个问题:数轴上有些点,选择一个位置使得它到所有点的距离和最小,就是\(\min\{\sum|p-x_i|\}\),我们取中位数就可以了。

对于\(\sum|x_1-x_{2,i}|\),同样取\(x_2\)的中位数就可以了。区间中位数可以用主席树求。

懒得离散化了...


//6026ms	137.211MiB
#include <cmath>
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5; int A[N],B[N],root1[N],root2[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Segment_Tree
{
#define ls son[x][0]
#define rs son[x][1]
#define S N*35
int tot,sz[S],son[S][2];
LL ans,sum[S];
#undef S
void Insert(int &x,int y,int l,int r,int p)
{
sz[x=++tot]=sz[y]+1, sum[x]=sum[y]+p;
if(l==r) return;
int m=(LL)l+r>>1;//LL!
p<=m?(rs=son[y][1],Insert(ls,son[y][0],l,m,p)):(ls=son[y][0],Insert(rs,son[y][1],m+1,r,p));
}
int Query(int x,int y,int l,int r,int k)//x-y
{
if(l==r) return l;
int m=(LL)l+r>>1,mid,t=sz[ls]-sz[son[y][0]];
if(t>=k)
mid=Query(ls,son[y][0],l,m,k), ans+=sum[rs]-sum[son[y][1]]-1ll*mid*(sz[rs]-sz[son[y][1]]);
else
mid=Query(rs,son[y][1],m+1,r,k-t), ans+=1ll*mid*(sz[ls]-sz[son[y][0]])-(sum[ls]-sum[son[y][0]]);
return mid;
}
}T1,T2; inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now*f;
} int main()
{
// freopen("spy.in","r",stdin);
// freopen("spy.out","w",stdout); #define S1 L1,R1
#define S2 L2,R2
int n=read(),q=read(),mnA=1e9,mxA=-1e9,mnB=1e9,mxB=-1e9;
for(int i=1; i<=n; ++i) A[i]=read(),mnA=std::min(mnA,A[i]),mxA=std::max(mxA,A[i]);
for(int i=1; i<=n; ++i) B[i]=read(),mnB=std::min(mnB,B[i]),mxB=std::max(mxB,B[i]);
int L1=mnA+mnB,R1=mxA+mxB,L2=mnA-mxB,R2=mxA-mnB;
for(int i=1; i<=n; ++i) T1.Insert(root1[i],root1[i-1],S1,A[i]+B[i]), T2.Insert(root2[i],root2[i-1],S2,A[i]-B[i]);
for(; q--; )
{
int l=read(),r=read(),p=r-l+2>>1;
T1.ans=0, T2.ans=0, T1.Query(root1[r],root1[l-1],S1,p), T2.Query(root2[r],root2[l-1],S2,p);
printf("%.2lf\n",(T1.ans+T2.ans)*0.5);
} return 0;
}

spy(主席树)的更多相关文章

  1. bzoj3207--Hash+主席树

    题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...

  2. bzoj1901--树状数组套主席树

    树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...

  3. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...

  4. BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3522  Solved: 1041[Submi ...

  5. BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 5217  Solved: 1233 ...

  6. BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7143  Solved: 2968[Su ...

  7. [bzoj3932][CQOI2015][任务查询系统] (主席树)

    Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...

  8. [bzoj2588][count on a tree] (主席树+lca)

    Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...

  9. [bzoj2653][middle] (二分 + 主席树)

    Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...

随机推荐

  1. 基于kali linux无线网络渗透测试

    1.无线网络渗透测试目前主要有三种方式,分别是暴力破解PIN码,跑握手包,搭建伪热点三种方式,当然还存在其他的方式. 1.1暴力破解 路由器的PIN码由八位0-9的数字组成,PIN码由散步风组成,前四 ...

  2. HTML&javaSkcript&CSS&jQuery&ajax(七)

    ’一.HTML5 实例  <video width="430" controls>   <source src="mov_nnn.mp4" t ...

  3. uva11426 欧拉函数应用,kuangbin的筛法模板

    /* 给定n,对于所有的对(i,j),i<j,求出sum{gcd(i,j)} 有递推式sum[n]=sum[n-1]+f[n] 其中f[n]=gcd(1,n)+gcd(2,n)+gcd(3,n) ...

  4. hdu4003

    /*依赖背包的通常做法就是对于每个结点,先处理处其所有子节点的dp,然后对于当前结点进行分组背包dp即可 还是依赖背包问题,dp[i][j]表示结点i的子树用了j个机器人的搜索代价 边界条件,如果某个 ...

  5. bzoj 1042

    典型的背包+容斥 首先,考虑如果没有个数的限制,那么就是一个完全背包,所以先跑一个完全背包,求出没有个数限制的方案数即可 接下来,如果有个数的限制,那么我们就要利用一些容斥的思想:没有1个超过限制的方 ...

  6. sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序

    转载: 查看原文 在javascript中,对象和数组是两种不同的类型,这和php中的数组概念不同.在javascript中,也有一些精妙的算法,用来对一些对象进行排序.我在面试迅雷的时候,也拿到一道 ...

  7. 理解并设计rest/restful风格接口

    网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致AP ...

  8. Nancy 返回值详解

    简介 Nancy 是一个轻量级的,简单粗暴的framework用来构建基于HTTP的各种服务,兼容.Net和Mono.它的返回值也是多种多样的,适应各种不同的情况.包括Response.AsFile( ...

  9. WebService服务介绍与调用

    一: WebService简介 WebService是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言的下的一个子集)标准来描述.发布.发现.协调 ...

  10. JavaScript数组去重的6个方法

    方法一无需思考,我们可以得到 O(n^2) 复杂度的解法.定义一个变量数组 res 保存结果,遍历需要去重的数组,如果该元素已经存在在 res 中了,则说明是重复的元素,如果没有,则放入 res 中. ...