hdu 3473 Minimum Sum 划分树
http://acm.hdu.edu.cn/showproblem.php?pid=3473
对于xl,xl+1……xr,使得[xi-x]和最小,显然x应当为其中的中位数。中位数可以通过求K大数解决,划分树可搞。
对于求和,分为两部分,小于x的部分,大于y的部分,在建树的时候也保存下来分到左子树中的数的和。
最终的和为ave*(lnum-rnum)+rsum-lsum
ave为中位数,lnum为左子数的数量,也就是小于中位数的数量,rnum为右子数,lsum表示小于中位数部分的和
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define ls (rt<<1)
#define rs ((rt<<1)|1)
#define mid ((t[rt].l+t[rt].r)>>1)
#define ll long long
const int maxn = 100010;
struct node {int l , r;
}t[maxn<<2];
int sa[maxn],num[20][maxn],cnt[20][maxn];
ll Lsum[20][maxn],sum[maxn];
int n , q;
void build(int l,int r,int rt,int deep) {t[rt].l = l; t[rt].r = r;if(l == r) return;int mid_val = sa[mid],lsum=mid-l+1;for(int i=l;i<=r;i++)if(num[deep][i] < mid_val)lsum --;int L = l , R = mid + 1;for(int i=l;i<=r;i++) {if(i == l) cnt[deep][i] = 0;else cnt[deep][i] = cnt[deep][i-1];Lsum[deep][i]=Lsum[deep][i-1];if(num[deep][i]<mid_val || num[deep][i]==mid_val && lsum>0) {num[deep+1][L++] = num[deep][i];cnt[deep][i] ++;Lsum[deep][i]+=(ll)num[deep][i];if(num[deep][i] == mid_val)lsum --;}else num[deep+1][R++] = num[deep][i];}build(l,mid,ls,deep+1);build(mid+1,r,rs,deep+1);
}
int lnum;
ll lsum;
int query(int l,int r,int rt,int k,int deep) {if(l == r) return num[deep][l];int s1 , s2;if(t[rt].l == l) s1 = 0;else s1 = cnt[deep][l-1];s2 = cnt[deep][r] - s1;if(k <= s2)return query(t[rt].l+s1,t[rt].l+s1+s2-1,ls,k,deep+1);int b1 = l-1-t[rt].l+1-s1;int b2 = r-l+1-s2;lnum += s2;lsum = (ll)lsum+Lsum[deep][r]-Lsum[deep][l-1];return query(mid+1+b1,mid+1+b1+b2-1,rs,k-s2,deep+1);
}
int main() {int T , cas = 1;scanf("%d" , &T);while(T--) {printf("Case #%d:\n" , cas++);scanf("%d" , &n);sum[0] = 0;for(int i=1;i<=n;i++) {scanf("%d",&num[1][i]);sa[i] = num[1][i];sum[i] = (ll)sum[i-1] + sa[i];}sort(sa+1,sa+1+n);build(1,n,1,1);scanf("%d",&q);while(q--) {int l , r, k;scanf("%d%d",&l,&r);l ++; r ++;k = (r-l+2)>>1;lnum = lsum = 0;int ave = query(l,r,1,k,1);printf("%I64d\n",ave*(lnum-(r-l+1-lnum))+sum[r]-sum[l-1]-lsum-lsum);}puts("");}return 0;
}
转载于:https://www.cnblogs.com/tobec/p/3237747.html
hdu 3473 Minimum Sum 划分树相关推荐
- HDU 3473 Minimum Sum 【划分树】
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3473 ★没想到划分树里面也可以加东西,wcsl 题意: 给你一个由n个数组成的序列,有m次询问,每次询 ...
- HDU-3743 Minimum Sum,划分树模板
Minimum Sum 被这个题坑了一下午,原来只需找一个最中间的数即可,我以为是平均数. 题意:找一个数使得这个数和区间内所有数的差的绝对值最小.输出最小值. 开始用线段树来了一发果断T了,然后各种 ...
- HDU 3473 Minimum Sum
HDU_3437 比较容易证明,x应该取区间的中位数,于是问题就转化成了求[l,r]区间内大小排第(l+r)/2+1的数,然后将和计算出来即可. 求区间的中位数可以用划分树来实现,但是和却不可以在求得 ...
- hdu 2665 Kth number(划分树模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2665 [ poj 2104 2761 ] 改变一下输入就可以过 http://poj.org/problem? ...
- HDU 4417 Super Mario(划分树)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu 2665 Kth number 划分树
求区间第k大元素的值, 看代码的注释. #include<cstring> #include<cstdio> #include<iostream> #include ...
- HDU - 6955 Xor sum tire树 + 贪心
传送门 文章目录 题意: 思路: 题意: 给你一个数列aaa,你需要找出来一个长度最小且左端点最靠前的区间,使其异或和≥k\ge k≥k. n≤1e5,0≤ai,k<230n\le1e5,0\l ...
- hdu 4417 Super Mario 划分树+二分
http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意: 给定一个长度为n的序列,求区间[L,R]中小于h的个数: 思路: 分三种情况: 1:如果该区间最小 ...
- HDU - 4825 Xor Sum(字典树)
题目链接:点击查看 题目大意:给出n个数组成的数组,再给出m个询问,每次询问给出一个x,要求从数组中选出一个k,使得k^x的值最大 题目分析:字典树求异或值最大的模板题,对于n个数直接insert到字 ...
最新文章
- 准备翻译Windows 8 动手实验系列教程
- 【论文解读】NN如何在表格数据中战胜GBDT类模型!
- Visual Studio 2015 update 3各版本下载地址
- xay loves trees
- html中左侧播放器插件,简洁实用的html5音乐播放器插件
- 【flink】flink写入clickhouse Error while starting CH writer AccessDeninedExcepton
- 认识目标文件的格式—— a.out COFF PE ELF
- EPLAN P2.7安装教程
- 计算机公式英汉对照,Excel 2013中英文对照图
- 常用的两款 爱普生epson L801(L系列)清零软件 废墨重置软件 免分下载 内附清零软件使用方法
- Git 分支管理最佳实践
- 老年人大学计算机课程,老人学电脑(入门级)
- Pycharm十大常用快捷键
- 肿瘤免疫疗法 | 细胞治疗和PD1/PDL1 | Tumor immunotherapy | cell therapy
- 淘宝店铺商品接口 item_search_shop数据获取、拼多多关键词、1688原数据接口、淘宝商品详情sku信息等各大电商平台接口采集调用展示
- table行的折叠和展开
- 对JSON中的key进行驼峰和下划线格式的相互转换
- 中国五大国家级城市群经济图谱
- 再也不用担心因为PowerBI 可视化看板加班了——手把手详细教学
- 生物力学计算机模拟,计算机模拟在跳台跳水起跳技术中生物力学分析.doc
热门文章
- 北师大版图形的旋转二教案_新北师大版八年级下册数学 《图形的旋转(2)》教案...
- 拉斯维加斯算法结合八皇后问题
- 图像目标检测(Object Detection)原理与实现(三)
- Javascript 面向对象中的构造函数和原型对象
- application.yml改成bootstrap.yml不报错了(Failed to configure a DataSource: ‘url’ attribute)
- 基于CentOS7,MySQL5.7的同步/半同步复制实现
- Docker核心技术之联合文件系统
- MongoDB的增删改查操作
- 关于mybatis中type-aliases-package使用的几个问题
- 关于分布式集群的几个问题