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 ...
随机推荐
- Django基础之cookie
1. Cookie 1.1 Cookie的由来 大家都知道HTTP协议是无状态的.无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系, 它不会受前面的请求响应情况 ...
- Codeforces 808 E. Selling Souvenirs(三分)
E. Selling Souvenirs 题意: n件物品,有重量和价值,重量只有三种1,2,3.问取不超过m重量的物品的价值总和最大是多少.(n<=1e5,w<=3e5) 思路: n*w ...
- centos7下面改变亮度
通过改自己的配置文件来改变亮度的方法在我的机器上面是不中用了,我的是台式机,我用的集成显卡,目前我找到的还勉强的方法就是通过安装redshift来改变屏幕的亮度,我就是不喜欢太亮,差点瞎了. 具体是这 ...
- Nginx数据结构之内存池
基本结构 1. ngx_pool_t struct ngx_pool_s { ngx_pool_data_t d; size_t max; ngx_pool_t *current; ngx_chain ...
- 前端知识点回顾——Javascript篇(一)
DOM特殊元素获取 document.documentElement //HTML标签 document.head //head标签 document.title //title标签 document ...
- SpringCloud(三)之Feign实现负载均衡的使用
一 点睛 Feign是Netflix开发的声明式.模板化的HTTP客户端, Feign可以帮助我们更快捷.优雅地调用HTTP API. 在Spring Cloud中,使用Feign非常简单——创建一个 ...
- python之crawlscrapy爬取某集团招聘信息以及招聘详情
针对这种招聘信息,使用crawlscrapy很适合. 1.settings.py # -*- coding: utf-8 -*- # Scrapy settings for gosuncn proje ...
- Google Protocol Buffer 用法 C#
在网上查了一下,虽然有很多文章介绍Protocol Buffer,但是实际使用起来,还是会遇到很多问题,所以我想应该有一个指南一样的东西,让新手很快就能使用它. Protocol Buffer简写为P ...
- Qt编写自定义控件17-按钮进度条
前言 按钮进度条,顾名思义,表面上长得像一个按钮,单击以后切换成进度条指示按钮单击动作执行的进度,主要用在一些需要直接在按钮执行动作显示对应进度的场景,在很多网页中经常看到这种效果,这个效果有个优点就 ...
- Kettle实现从mysql中取2张表数据关联的数据,并写入到mongodb中
1 建立转换,并设置DB连接到mysql 选中DB连接:连接类型选择MySQL,输入主机名称,数据库名称,端口号,用户名,密码 输入连接名称,点击确定.(可以先点击测试,测试一下是否连接成功) 如下图 ...