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

很妙的转化...

$\max(\left|a_1-a_2\right|,\left|b_1-b_2\right|)=\max(a_1-a_2,a_2-a_1,b_1-b_2,b_2-b_1)$

令$x_1=\frac{a_1+b_1}2,y_1=\frac{a_1-b_1}2$,类似定义$x_2,y_2$,原式变为

$\begin{aligned}\max(x_1+y_1-x_2-y_2,x_2+y_2-x_1-y_1,x_1-y_1-x_2+y_2,x_2-y_2-x_1+y_1)&=\max(x_1-x_2,x_2-x_1)+\max(y_1-y_2,y_2-y_1)\\&=\left|x_1-x_2\right|+\left|y_1-y_2\right|\end{aligned}$

我们现在要找到$x',y'$使得$\sum\limits_{i=l}^r\left|x'-x_i\right|+\left|y'-y_i\right|$最小,拆开之后就变成两个区间中位数,此时可以用可持久化线段树解决

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
struct seg{
	int l,r,c;
	ll s;
}t[4000010];
int r1[100010],r2[100010],v[200010],M,N;
void modify(int pr,int&nr,int p,int v,int l,int r){
	nr=++M;
	t[nr]=t[pr];
	t[nr].s+=v;
	t[nr].c++;
	if(l==r)return;
	int mid=(l+r)>>1;
	if(p<=mid)
		modify(t[pr].l,t[nr].l,p,v,l,mid);
	else
		modify(t[pr].r,t[nr].r,p,v,mid+1,r);
}
ll d,res;
void query(int pr,int nr,int k,int l,int r){
	if(l==r){
		d=v[l];
		return;
	}
	int mid=(l+r)>>1,lc,rc;
	ll ls,rs;
	lc=t[t[nr].l].c-t[t[pr].l].c;
	rc=t[t[nr].r].c-t[t[pr].r].c;
	ls=t[t[nr].l].s-t[t[pr].l].s;
	rs=t[t[nr].r].s-t[t[pr].r].s;
	if(k<=lc){
		query(t[pr].l,t[nr].l,k,l,mid);
		res+=rs-rc*d;
	}else{
		query(t[pr].r,t[nr].r,k-lc,mid+1,r);
		res+=d*lc-ls;
	}
}
int a[100010],b[100010];
int main(){
	int n,m,i,x,y;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)scanf("%d",a+i);
	for(i=1;i<=n;i++)scanf("%d",b+i);
	for(i=1;i<=n;i++){
		v[++N]=a[i]+b[i];
		v[++N]=a[i]-b[i];
	}
	sort(v+1,v+N+1);
	N=unique(v+1,v+N+1)-v-1;
	for(i=1;i<=n;i++){
		modify(r1[i-1],r1[i],lower_bound(v+1,v+N+1,a[i]+b[i])-v,a[i]+b[i],1,N);
		modify(r2[i-1],r2[i],lower_bound(v+1,v+N+1,a[i]-b[i])-v,a[i]-b[i],1,N);
	}
	while(m--){
		scanf("%d%d",&x,&y);
		res=0;
		query(r1[x-1],r1[y],(y-x)/2+1,1,N);
		query(r2[x-1],r2[y],(y-x)/2+1,1,N);
		printf("%lld.%d0\n",res/2,res&1?5:0);
	}
}

[xsy1144]选物品的更多相关文章

  1. 【xsy1144】选物品 主席树

    题目大意:$N$ 件物品摆成一排,给每个物品定义两个属性 $A$ 和$ B$,两件物品的 差异度 定义为它们两种属性的差的绝对值中较大的一个.如果要求出一些物品的差异度,我们先定义一个 理想物品,使它 ...

  2. POJ 1293 - Duty Free Shop 01背包记录所选物品

    裸的01背包.dp[x]只要是bool型记录当前空间是否可用.. 而为了找到用了哪些物品..dp[x]设置为int型..进行记录.. Program: #include<iostream> ...

  3. 【hdu3033】分组背包(每组最少选一个)

    [题意] 有S款运动鞋,一个n件,总钱数为m,求不超过总钱数且每款鞋子至少买一双的情况下,使价值最大.如果有一款买不到,就输出“Impossible". 1<=N<=100  1 ...

  4. hs-black 杂题选讲

    [POI2011]OKR-Periodicity 考虑递归地构造,设 \(\text{solve(s)}\) 表示字典序最小的,\(\text{border}\) 集合和 \(S\) 的 \(\tex ...

  5. 背包九讲 && 题目

    ★.背包求方案数的时候,多重背包是不行的,因为产生重复的背包会有多种情况. ★.背包记录路径的时候,其实是不行的,因为更新了12的最优解,如果它依赖于6这个背包,然后你后面改变了6这个背包,就GG 1 ...

  6. Unity3D引擎扩展中的编辑器定制方法

    http://gamerboom.com/archives/36432 作者:Richard Fine Unity3D的方便之处在于,它很容易地扩展编辑器套件.每款游戏都对加工有着不同的需求,可以快速 ...

  7. h5 本地存储和读取信息

    总结:cookie的缺点很明显,最多只能存储4KB的数据,每个HTTP请求都会被传送回服务器,明文传输(除非你使用SSL)对于购物网站而言,cookie是非常重要的,为了实现购物车功能,把已选物品加入 ...

  8. [HDU 2546]饭卡 (动态规划)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 题意:见题目 刚开始怎么写都写不对,后来吃饭的时候想了想记忆化搜索的办法 就是说设dp(now, ...

  9. HDU 2126 Buy the souvenirs (01背包,输出方案数)

    题意:给出t组数据 每组数据给出n和m,n代表商品个数,m代表你所拥有的钱,然后给出n个商品的价值 问你所能买到的最大件数,和对应的方案数.思路: 如果将物品的价格看做容量,将它的件数1看做价值的话, ...

随机推荐

  1. 数字签名算法rsa

    数字签名算法消息传递模型 由消息发送方构建密钥对,这里由甲方完成. 由消息发送方公布公钥至消息接收方,这里由甲方将公钥公布给乙方. 注意如加密算法区别,这里甲方使用私钥对数据签名,数据与签名形成一则消 ...

  2. Java面试基础知识1

    1.动态绑定是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 2.在将超类转换为子类之前,应该使用instanceof进行检查. 3.包含一个或者多个抽象方法的类本身必须被声 ...

  3. python自动开发之第二十五天

    一.组合搜索 参考: http://www.cnblogs.com/ccorz/p/5985205.html 二.JSONP 1.在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但 ...

  4. Linux下用freetds执行SQL Server的sql语句和存储过程

    Linux下用freetds执行SQL Server的sql语句和存储过程 http://www.linuxidc.com/Linux/2012-06/61617.htm freetds相关 http ...

  5. 内核添加USB模块

    Device Drivers->SCSI device support->SCSI disk support Device Drivers->USB support->Supp ...

  6. 几条学习python的建议

    熟悉python语言, 以及学会python的编码方式. 熟悉python库, 遇到开发任务的时候知道如何去找对应的模块. 知道如何查找和获取第三方的python库, 以应付开发任务. 学习步骤 安装 ...

  7. Disruptor 线程间共享数据无需竞争

    队列的作用是缓冲 缓冲到 队列的空间里.. 线程间共享数据无需竞争 原文 地址  作者  Trisha   译者:李同杰 LMAX Disruptor 是一个开源的并发框架,并获得2011 Duke’ ...

  8. Storm实战常见的问题

    该文档为实实在在的原创文档,转载请注明: http://blog.sina.com.cn/s/blog_8c243ea30101k0k1.html 类型 详细 备注 该文档是群里几个朋友在storm实 ...

  9. hdu 2881(LIS变形)

    Jack's struggle Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  10. 从徐飞的文章《Web应用的组件化开发(一)中窥视web应用开发的历史

    Web应用的组件化开发(一) 原文来自 徐飞 基本思路 1. 为什么要做组件化? 无论前端也好,后端也好,都是整个软件体系的一部分.软件产品也是产品,它的研发过程也必然是有其目的.绝大多数软件产品是追 ...