题目大意:$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. UUID含义及ubuntu配置系统默认JDK

    UUID含义是通用唯一识别码(Universally Unique Identifier) GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随即数来生 ...

  2. c++中类的静态数据成员

    有时需要为某个类的所有对象分配一个单一的存储空间,这个存储空间只是被这个类的对象访问,其他人不能访问,那么这时静态的成员变量是有用的.例如下面用来统计一共创建了多少个对象的变量num class cl ...

  3. 2018.07.03 HDU Rikka with Phi(线段树)

    Rikka with Phi Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) P ...

  4. Spring boot变量的初始化顺序

    起因是Spring建议”总是在您的bean中使用构造函数建立依赖注入.总是使用断言强制依赖”,而且之前用@Autowired时idea总是给警告,于是全部改成了构造器注入,运行时发生了循环注入,于是找 ...

  5. hibernate hql where语句拼接工具类

    package com.zhaoshijie.tree.other; /** * hibernate HQL WHERE语句工具类 * * @author 赵士杰 * */public class H ...

  6. 基础的linux学习

    学习了这几个命令分享一下: 文本文件内搜索数据 grep -n -e pattern1 -e pattern2 file1 -n 搜索到的数据显示行号展示 -e pattern1 多个匹配模式下可以通 ...

  7. Codeforces805 A. Fake NP 2017-05-05 08:30 327人阅读 评论(0) 收藏

    A. Fake NP time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  8. hdu 4888 最大流慢板

    http://acm.hdu.edu.cn/showproblem.php?pid=4888 添加一个源点与汇点,建图如下: 1. 源点 -> 每一行对应的点,流量限制为该行的和 2. 每一行对 ...

  9. 循环读取list 的几种方法?

    1.最常用的方法.循环找出该位子的list元素for(int i = 0;i < list.size(); i ++){System.out.println(list.get(i));}2.利用 ...

  10. java web eclipse中项目的加载过程

    java web eclipse中项目的加载过程: Tomcat默认从WEB-INF/目录下加载资源,Eclipse在发布程序的时候,并没有把User Libraries的相关资源拷贝到WEB-INF ...