题目大意:$N$ 件物品摆成一排,给每个物品定义两个属性 $A$ 和$ B$,两件物品的 差异度 定义为它们两种属性的差的绝对值中较大的一个。如果要求出一些物品的差异度,我们先定义一个 理想物品,使它与这些物品中每个物品的差异度的和最小,这些物品的差异度就是这个最小的和。给定$ N$ 个物品和Q组询问,询问从 $L $到 $R$ 的物品差异度为多少。

我们设物品$i$和物品$j$之间的差异度为$D$,则

$D=max\{|A_i-A_j|,|B_i-B_j|\}$

$=max\{A_i-A_j,A_j-A_i,B_i-B_j,B_j-B_i\}$

我们令$X_i=A_i+B_i,X_j=A_j+B_j,Y_i=A_i-B_i,Y_j=A_j-B_j$。

则有$D=max\{(X_i-X_j)+(Y_i-Y_j),(X_i-X_j)-(Y_i-Y_j),-(X_i-X_j)+(Y_i-Y_j),-(X_i-X_j)-(Y_i-Y_j)\}$

简单化简后,$D=|X_i-X_j|+|Y_i-Y_j|$。

对于每一件物品,我们求出其对应的$X$值和$Y$值。

我们建两棵主席树,分别维护$X$值和$Y$值。

查询一个区间时,我们在两棵主席树上分别查询区间中位数,然后随便维护一下就行了。

时间复杂度:$O(n\log\ n)$。

 #include<bits/stdc++.h>
#define M 100005
#define L long long
#define INF (2e9)
using namespace std; L n,q,A[M]={},B[M]={}; L lc[M*]={},rc[M*]={},siz[M*]={},cnt=; L sum[M*]={};
L root1[M]={},root2[M]={};
void add(L &x,L l,L r,L now){
cnt++; lc[cnt]=lc[x]; rc[cnt]=rc[x];
siz[cnt]=siz[x]+; sum[cnt]=sum[x]+now; x=cnt;
if(l==r) return; L mid=(l+r)>>;
if(now<=mid) add(lc[x],l,mid,now);
else add(rc[x],mid+,r,now);
}
L getkth(L x,L y,L l,L r,L k){
if(l==r) return l;
L mid=(l+r)>>;
if(siz[lc[y]]-siz[lc[x]]<k) return getkth(rc[x],rc[y],mid+,r,k-(siz[lc[y]]-siz[lc[x]]));
return getkth(lc[x],lc[y],l,mid,k);
}
L getsum(L x,L l,L r,L ll,L rr){
if(ll<=l&&r<=rr) return sum[x];
L mid=(l+r)>>,res=;
if(ll<=mid) res+=getsum(lc[x],l,mid,ll,rr);
if(mid<rr) res+=getsum(rc[x],mid+,r,ll,rr);
return res;
} main(){
scanf("%lld%lld",&n,&q);
for(L i=;i<=n;i++) scanf("%lld",A+i);
for(L i=;i<=n;i++) scanf("%lld",B+i);
for(L i=;i<=n;i++){
L upd1=A[i]+B[i],upd2=A[i]-B[i];
root1[i]=root1[i-]; root2[i]=root2[i-];
add(root1[i],-INF,INF,upd1);
add(root2[i],-INF,INF,upd2);
}
while(q--){
L l,r,k,h;L res=,mid; scanf("%lld%lld",&l,&r);
h=(r-l)/+; mid=(l+r)>>;
k=getkth(root1[l-],root1[r],-INF,INF,h);
res+=getsum(root1[r],-INF,INF,k,INF)-getsum(root1[l-],-INF,INF,k,INF);
res-=k*(r-mid+);
res+=(mid-l)*k;
res-=getsum(root1[r],-INF,INF,-INF,k-)-getsum(root1[l-],-INF,INF,-INF,k-); k=getkth(root2[l-],root2[r],-INF,INF,h);
res+=getsum(root2[r],-INF,INF,k,INF)-getsum(root2[l-],-INF,INF,k,INF);
res-=k*(r-mid+);
res+=(mid-l)*k;
res-=getsum(root2[r],-INF,INF,-INF,k-)-getsum(root2[l-],-INF,INF,-INF,k-); printf("%.2lf\n",0.5*res);
}
}

【xsy1144】选物品 主席树的更多相关文章

  1. [xsy1144]选物品

    题意:给定$a_{1\cdots n},b_{1\cdots n}$,询问是给定$l,r$,找出$a',b'$使得$\sum\limits_{i=l}^r\max(\left|a'-a_i\right ...

  2. 4.24 省选模拟赛 欧珀瑞特 主席树 可持久化trie树

    很容易的一道题目.大概.不过我空间计算失误MLE了 我草草的计算了一下没想到GG了. 关键的是 我学了一个dalao的空间回收的方法 但是弄巧成拙了. 题目没有明确指出 在任意时刻数组长度为有限制什么 ...

  3. PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)

    1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...

  4. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  5. BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)

    BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...

  6. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...

  7. bzoj 2653 middle 二分答案 主席树判定

    判断中位数是否可行需要将当前的解作为分界,大于其的置为1,小于为-1,然后b-c必选,ab,cd可不选,这个用线段树判定就好 但不能每次跑,所以套主席树,按权值排序,构建主席树,更新时将上一个节点改为 ...

  8. codeforces 813E 主席树

    题意: 一个数列多组询问,每次询问[l,r]中最多能选多少个数字,其中每个数字的出现次数不超过k次 题解: 我们保存对于每个位置上,出现超过k次的位置,那么对于每次询问,我们就变成了查询区间[l,r] ...

  9. 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )

    在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...

随机推荐

  1. linux 常用压缩打包和解压命令

    ## zcvf gzip jcvf bzip2 gunzip  tar zxvf  jxvf  

  2. Angular 通过注入 $location 获取与修改当前页面URL

    //1.获取当前完整的url路径 var absurl = $location.absUrl(); //http://172.16.0.88:8100/#/homePage?id=10&a=1 ...

  3. linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用

    本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...

  4. Hi,everybod,搬家了

    Hi,小伙伴们,我的博客已经搬家到了GitHub,地址是:http://wxb.github.io/Blog/ 博客园以后就不维护了,有什么问题咱们GitHub上讨论啦,可以在:https://git ...

  5. Javascript 中函数的 length 属性

    每个函数都有一个 length属性 (函数名.length), 表示期望接收的函数的个数(而不是实际接收的参数个数) 它与arguments不同. arguments.length 是表示函数实际接收 ...

  6. java基础-day4

    第04天 java基础语法 今日内容介绍 u Random u 数组 第1章   Random 1.1      产生整数随机数 1.1.1    Random的使用步骤 我们想产生1~100(包含1 ...

  7. linux下怎样用c语言调用shell命令

    C程序调用shell脚本共同拥有三种法子 :system().popen().exec系列数call_exec1.c , system() 不用你自己去产生进程.它已经封装了,直接增加自己的命令 ex ...

  8. 用 PHP 编写 http 服务器

    概述 众所周知,我们一般使用 PHP 开发Web程序时需要使用到比如Apache或Nginx等Web服务器来支持,那么有没有办法直接使用PHP开发HTTP服务器,答案当然是可以的,最近看了一遍Work ...

  9. bootstrap modal

    模态框提供了两个可选尺寸,通过为 .modal-dialog 增加一个样式调整类实现.加modal-lg,加modal-sm,不加也可以,共有三种尺寸. 触发方式,data-target, 感觉比js ...

  10. 日志记录的作用和方法 java

    程序中记录日志一般有两个目的:Troubleshooting和显示程序运行状态.好的日志记录方式可以提供我们足够多定位问题的依据.日志记录大家都会认为简单,但如何通过日志可以高效定位问题并不是简单的事 ...