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 划分树相关推荐

  1. HDU 3473 Minimum Sum 【划分树】

    题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3473 ★没想到划分树里面也可以加东西,wcsl 题意: 给你一个由n个数组成的序列,有m次询问,每次询 ...

  2. HDU-3743 Minimum Sum,划分树模板

    Minimum Sum 被这个题坑了一下午,原来只需找一个最中间的数即可,我以为是平均数. 题意:找一个数使得这个数和区间内所有数的差的绝对值最小.输出最小值. 开始用线段树来了一发果断T了,然后各种 ...

  3. HDU 3473 Minimum Sum

    HDU_3437 比较容易证明,x应该取区间的中位数,于是问题就转化成了求[l,r]区间内大小排第(l+r)/2+1的数,然后将和计算出来即可. 求区间的中位数可以用划分树来实现,但是和却不可以在求得 ...

  4. hdu 2665 Kth number(划分树模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=2665 [ poj 2104 2761 ]  改变一下输入就可以过 http://poj.org/problem? ...

  5. HDU 4417 Super Mario(划分树)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. hdu 2665 Kth number 划分树

    求区间第k大元素的值, 看代码的注释. #include<cstring> #include<cstdio> #include<iostream> #include ...

  7. HDU - 6955 Xor sum tire树 + 贪心

    传送门 文章目录 题意: 思路: 题意: 给你一个数列aaa,你需要找出来一个长度最小且左端点最靠前的区间,使其异或和≥k\ge k≥k. n≤1e5,0≤ai,k<230n\le1e5,0\l ...

  8. hdu 4417 Super Mario 划分树+二分

    http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意: 给定一个长度为n的序列,求区间[L,R]中小于h的个数: 思路: 分三种情况: 1:如果该区间最小 ...

  9. HDU - 4825 Xor Sum(字典树)

    题目链接:点击查看 题目大意:给出n个数组成的数组,再给出m个询问,每次询问给出一个x,要求从数组中选出一个k,使得k^x的值最大 题目分析:字典树求异或值最大的模板题,对于n个数直接insert到字 ...

最新文章

  1. 准备翻译Windows 8 动手实验系列教程
  2. 【论文解读】NN如何在表格数据中战胜GBDT类模型!
  3. Visual Studio 2015 update 3各版本下载地址
  4. xay loves trees
  5. html中左侧播放器插件,简洁实用的html5音乐播放器插件
  6. 【flink】flink写入clickhouse Error while starting CH writer AccessDeninedExcepton
  7. 认识目标文件的格式—— a.out COFF PE ELF
  8. EPLAN P2.7安装教程
  9. 计算机公式英汉对照,Excel 2013中英文对照图
  10. 常用的两款 爱普生epson L801(L系列)清零软件 废墨重置软件 免分下载 内附清零软件使用方法
  11. Git 分支管理最佳实践
  12. 老年人大学计算机课程,老人学电脑(入门级)
  13. Pycharm十大常用快捷键
  14. 肿瘤免疫疗法 | 细胞治疗和PD1/PDL1 | Tumor immunotherapy | cell therapy
  15. 淘宝店铺商品接口 item_search_shop数据获取、拼多多关键词、1688原数据接口、淘宝商品详情sku信息等各大电商平台接口采集调用展示
  16. table行的折叠和展开
  17. 对JSON中的key进行驼峰和下划线格式的相互转换
  18. 中国五大国家级城市群经济图谱
  19. 再也不用担心因为PowerBI 可视化看板加班了——手把手详细教学
  20. 生物力学计算机模拟,计算机模拟在跳台跳水起跳技术中生物力学分析.doc

热门文章

  1. 北师大版图形的旋转二教案_新北师大版八年级下册数学 《图形的旋转(2)》教案...
  2. 拉斯维加斯算法结合八皇后问题
  3. 图像目标检测(Object Detection)原理与实现(三)
  4. Javascript 面向对象中的构造函数和原型对象
  5. application.yml改成bootstrap.yml不报错了(Failed to configure a DataSource: ‘url’ attribute)
  6. 基于CentOS7,MySQL5.7的同步/半同步复制实现
  7. Docker核心技术之联合文件系统
  8. MongoDB的增删改查操作
  9. 关于mybatis中type-aliases-package使用的几个问题
  10. 关于分布式集群的几个问题