hdu 3473 区间条件极值 - 区间 差的绝对值 之和的最小
题目传送门//res tp hdu
目的
对长度为n的区间,给定q个子区间,求一x,使得区间内所有元素与x的差的绝对值之和最小。
多测。
n 1e5
q 1e5
ai [1,1e9] (i∈[1,n]);
数据结构
划分树
tip
该划分树维护的cnt并非元素所在区间内,该元素之前进入左子树的元素个数,而是整个区间内,该元素之前进入左子树的元素个数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int L = 100000+50;
typedef long long ll;
int n,q;
int tree[18][L];
int cnt[18][L];
ll sum[18][L],ans;
int a[L],sorted[L];
void build(int de,int l,int r){
if(l == r){
sum[de][l] = sum[de][l-1] + tree[de][l];return;
}
if(de == 0){
for(int i = 1;i<=r;++i)
tree[de][i] = a[i];
}
int mi=(l+r)>>1;
int scnt = mi - l + 1;
ll M = sorted[mi];
for(int i = l;i<=mi;++i) if(sorted[i] < M)
scnt--;
int pl = l,pr = mi + 1;
for(int i = l;i<=r;++i){
ll num =tree[de][i];
if(num == M){
if(scnt){
scnt--;
tree[de+1][pl++] = num;
cnt[de][i]++;
}
else
tree[de+1][pr++] = num;
}
else if(num < M){
tree[de+1][pl++] = num;
cnt[de][i]++;
}
else
tree[de+1][pr++] = num;
sum[de][i] = sum[de][i-1] + tree[de][i];
cnt[de][i] += cnt[de][i-1];
}
build(de+1,l,mi);
build(de+1,mi+1,r);
}
ll query(int de,int L,int R,int l,int r,int k){
if(L == R) return tree[de][L];
int mi = (L + R)>>1;
int lo1,lo2,hi1,hi2;
int CNT = cnt[de][r] - cnt[de][l-1];
lo1 = L + cnt[de][l-1] - cnt[de][L-1];
hi1 = L + cnt[de][r] - cnt[de][L-1] - 1;
lo2 = mi + 1 + l - L - cnt[de][l-1] + cnt[de][L-1];
hi2 = mi + 1 + r - L - cnt[de][r] + cnt[de][L-1];
if(k <= CNT){
if(hi2 >= lo2)
ans += sum[de+1][hi2] - sum[de+1][lo2-1];
return query(de+1,L,mi,lo1,hi1,k);
}
else{
if(hi1>=lo1)
ans -= sum[de+1][hi1] - sum[de+1][lo1-1];
return query(de+1,mi+1,R,lo2,hi2, k - CNT);
}
}
int main(){
int T,l,r;
int icase = 1;
scanf(" %d",&T);
while(T--){
scanf(" %d",&n);
memset(sum,0,sizeof(sum));
memset(cnt,0,sizeof(cnt));
for(int i = 1;i<=n;++i){
scanf(" %d",a + i);
sorted[i] = a[i];
}
sort(sorted+1,sorted+1+n);
build(0,1,n);
scanf(" %d",&q);
printf("Case #%d:\n",icase++);
while(q--){
ans = 0;
scanf(" %d %d",&l,&r);
l++;r++;
ll t = query(0,1,n,l,r,(r - l)/2 + 1);
if((r-l)%2 == 1)
ans -= t;
printf("%lld\n", ans);
}
cout<<endl;
}
}
hdu 3473 区间条件极值 - 区间 差的绝对值 之和的最小的更多相关文章
- hdu 6601 区间条件极值 - 区间 最大 三角形周长
题目传送门//res tp hdu 目的 对长度为n的区间,给定q个子区间,求其元素能构成三角形的最大周长.有多组测试. n 1e5 q 1e5 ai [1,1e9] (i∈[1,n]); 数据结构 ...
- 563. Binary Tree Tilt 子节点差的绝对值之和
[抄题]: Given a binary tree, return the tilt of the whole tree. The tilt of a tree node is defined as ...
- hdu 5919 主席树(区间不同数的个数 + 区间第k大)
Sequence II Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- HDU.1689 Just a Hook (线段树 区间替换 区间总和)
HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...
- HDU 3397 Sequence operation(区间合并 + 区间更新)
题目链接:pid=3397">http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给定n个数,由0,1构成.共同拥有5种操作. 每一个操 ...
- BZOJ 4127: Abs (树链剖分 线段树求区间绝对值之和 带区间加法)
题意 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d(d>=0) 2 u v 表示询问路径 (u,v) 上点权绝对值的和 分析 绝对值之和不好处理,那么我们开 ...
- hdu 1698 线段树 区间更新 区间求和
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 3473 划分树
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- pandas处理时间序列(2):DatetimeIndex、索引和选择、含有重复索引的时间序列、日期范围与频率和移位、时间区间和区间算术
一.时间序列基础 1. 时间戳索引DatetimeIndex 生成20个DatetimeIndex from datetime import datetime dates = pd.date_rang ...
随机推荐
- 【线性代数】4-3:最小二乘近似(Least Squares Approximations)
title: [线性代数]4-3:最小二乘近似(Least Squares Approximations) categories: Mathematic Linear Algebra keywords ...
- Git 提交代码和更新代码
首先,操作之前一定要看清分支!! 其次,提交代码之前一定要先更新代码!! git branch -----查看当前分支 git pull -----更新代码到本地 ...
- Python实用黑科技——解包元素(1)
需求: 很多时候手上已经有了一个具有n个元素的列表或者元组,你打算把这些元素单独取出来(解包)放入n个变量组成的集合(这里的集合和Python自己的set不同)中. 方法: 显然,最好的办法就是直接用 ...
- AVL平衡树(非指针实现)
看了网上三四篇博客,学习了AVL树维护平衡的方式.但感觉他们给出的代码都有一点瑕疵或者遗漏,懂得了思想之后,花了一些时间把他们几篇的长处结合起来,没有使用指针,实现了一下.每个小逻辑功能都抽象成了函数 ...
- docker下的images 保存和导出
由于迁移测试环境,所以部署的的docker镜像某一些需要迁移到另外一台服务器上面去.. 我是用 docker save -o registry.tar registry 来把相应需要导出的images ...
- CDN之简介
1. 什么是 CDN? 来自 <什么是 CDN?> CDN(内容交付网络)是一种高度分布式服务器平台,为交付 Web 应用程序.流媒体等内容专门优化.服务器网络分布于众多物理和网络位置,对 ...
- cannot open clipboard 解决办法
对于电脑本身或者一些应用程序操作的时候,会出现cannot open clipboard的问题,这是你系统没有剪切板程序 首先: 在开始->运行中输入clipbrd 回车, 如果系统弹出了剪切板 ...
- Flutter移动电商实战 --(9)移动商城数据请求实战
1.URL接口管理文件建立 第一步需要在建立一个URL的管理文件,因为课程的接口会一直进行变化,所以单独拿出来会非常方便变化接口.当然工作中的URL管理也是需要这样配置的,以为我们会不断的切换好几个服 ...
- spark-submit 提交任务及参数说明
spark-submit 可以提交任务到 spark 集群执行,也可以提交到 hadoop 的 yarn 集群执行. 1. 例子 一个最简单的例子,部署 spark standalone 模式后,提交 ...
- torch学习中的难点
https://github.com/zergtant/pytorch-handbook/blob/master/chapter2/2.1.4-pytorch-basics-data-lorder.i ...