【xsy1144】选物品 主席树
题目大意:$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】选物品 主席树的更多相关文章
- [xsy1144]选物品
题意:给定$a_{1\cdots n},b_{1\cdots n}$,询问是给定$l,r$,找出$a',b'$使得$\sum\limits_{i=l}^r\max(\left|a'-a_i\right ...
- 4.24 省选模拟赛 欧珀瑞特 主席树 可持久化trie树
很容易的一道题目.大概.不过我空间计算失误MLE了 我草草的计算了一下没想到GG了. 关键的是 我学了一个dalao的空间回收的方法 但是弄巧成拙了. 题目没有明确指出 在任意时刻数组长度为有限制什么 ...
- PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)
1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)
BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- bzoj 2653 middle 二分答案 主席树判定
判断中位数是否可行需要将当前的解作为分界,大于其的置为1,小于为-1,然后b-c必选,ab,cd可不选,这个用线段树判定就好 但不能每次跑,所以套主席树,按权值排序,构建主席树,更新时将上一个节点改为 ...
- codeforces 813E 主席树
题意: 一个数列多组询问,每次询问[l,r]中最多能选多少个数字,其中每个数字的出现次数不超过k次 题解: 我们保存对于每个位置上,出现超过k次的位置,那么对于每次询问,我们就变成了查询区间[l,r] ...
- 主席树[可持久化线段树](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 ...
随机推荐
- Largest product from 3 integers
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...
- C++之类和对象的使用(三)
对象数组 如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供.Student stud[3]={90,92,01};//合法 如果构造函数有多个参数,则不能用在定义时直接所提供所有 ...
- vue实现消息的无缝滚动效果
export default { data() { return { animate:false, items:[ {name:"马云"}, {name:"雷军" ...
- SPSS--回归-多元线性回归模型案例解析
多元线性回归,主要是研究一个因变量与多个自变量之间的相关关系,跟一元回归原理差不多,区别在于影响因素(自变量)更多些而已,例如:一元线性回归方程 为: 毫无疑问,多元线性回归方程应该为: 上图中的 x ...
- redis只加载AOF文件
如果同时配置写AOF和RDB两种文件,但在redis启动时,只会加载AOF,除非配置只写RDB,才会加载RDB文件,也因此AOF文件必须是全量数据,所以会越来越大,这缺点也将是redis优化的一个方向 ...
- MVC 图片上传(转)
转自:http://www.cnblogs.com/Tiramisu/archive/2009/02/06/1385405.html MVC 上传图片 直接上代码: 页面:Index.aspx C ...
- hdu 1163 Eddy's digital Roots 【九余数定理】
http://acm.hdu.edu.cn/showproblem.php?pid=1163 九余数定理: 如果一个数的各个数位上的数字之和能被9整除,那么这个数能被9整除:如果一个数各个数位上的数字 ...
- 深入理解BS结构应用程序
随着学习的深入,和编程经验的丰富,对BS应用程序有一些认识. 在一些讨论软件技术的QQ群里,或一些社区.BBS中,经常会有一些初学者会犯一些认知性的错误.比如经常会有一些朋友提这样的一些问题:“我怎么 ...
- Bellman_ford货币兑换——正权回路判断
POJ1860 题目大意:你在某一点有一些钱,给定你两点之间钱得兑换规则,问你有没有办法使你手里的钱增多.就是想看看转一圈我的钱能不能增多,出现这一点得条件就是有兑换钱得正权回路,所以选择用bellm ...
- (原创)Hibernate persistentSet的remove()方法不起作用
情景再现:hibernate 多对多 User对象(员工).Educate对象(培训课程),我想干的事情是想把第三方表格user_educate中的员工_培训课程中的一行信息删掉(删掉员工所选的一门 ...