HDU 3473 Minimum Sum 划分树,数据结构 难度:1
http://acm.hdu.edu.cn/showproblem.php?pid=3473
划分树模板题目,需要注意的是划分树的k是由1开始的
划分树:
参考:http://blog.csdn.net/shiqi_614/article/details/8041390
划分树的定义
划分树定义为,它的每一个节点保存区间[lft,rht]所有元素,元素顺序与原数组(输入)相同,但是,两个子树的元素为该节点所有元素排序后(rht-lft+1)/2个进入左子树,其余的到右子树,同时维护一个num域,num[i]表示lft->i这个点有多少个进入了左子树。
划分树的Sample
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const int maxf=20;
int order[maxn];
int v[maxf][maxn];
ll s[maxn];
ll sum[maxf][maxn],asum;
int num[maxf][maxn];
void build(int l,int r,int ind){
if(l==r)return ;
int mid=(l+r)>>1;
int ln=l,rn=mid+1,same=mid-l+1;
for(int i=l;i<=r;i++){
if(v[ind][i]<order[mid])same--;
}
for(int i=l;i<=r;i++){
int flag=0;
if(v[ind][i]==order[mid]&&same>0){
same--;
flag=1;
v[ind+1][ln++]=v[ind][i];
sum[ind][i]=(i>0?sum[ind][i-1]:0)+v[ind][i];
}
else if(v[ind][i]<order[mid]){
flag=1;
v[ind+1][ln++]=v[ind][i];
sum[ind][i]=(i>0?sum[ind][i-1]:0)+v[ind][i];
}
else {
sum[ind][i]=i>0?sum[ind][i-1]:0;
v[ind+1][rn++]=v[ind][i];
}
num[ind][i]=(i>0?num[ind][i-1]:0)+flag;
}
build(l,mid,ind+1);
build(mid+1,r,ind+1);
}
int query(int s,int e,int k,int l,int r,int ind){
if(l==r)return v[ind][l];
int mid=(l+r)>>1;
int lls=num[ind][s-1]-num[ind][l-1];
int lse=num[ind][e]-num[ind][s-1];
int rls=s-l-lls;
int rse=e-s-lse+1;
if(lse>=k)return query(l+lls,l+lls+lse-1,k,l,mid,ind+1);
asum+=sum[ind][e]-(s>0?sum[ind][s-1]:0);
return query(mid+1+rls,mid+rls+rse,k-lse,mid+1,r,ind+1);
}
int main(){
int T;
scanf("%d",&T);
for(int t=1;t<=T;t++){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&v[0][i]);
order[i]=v[0][i];
s[i]=(i>0?s[i-1]:0)+v[0][i];
}
sort(order,order+n);
memset(num,0,sizeof(num));
build(0,n-1,0);
int q;
scanf("%d",&q);
printf("Case #%d:\n",t);
for(int i=0;i<q;i++){
int l,r;
scanf("%d%d",&l,&r);
asum=0;
ll mid=query(l,r,((l+r)>>1)-l+1,0,n-1,0);
ll ans=mid*(((l+r)>>1)-l)-(r-((l+r)>>1))*mid-asum+(s[r]-(l>0?s[l-1]:0)-asum-mid);
printf("%I64d\n",ans);
}
puts("");
}
}
HDU 3473 Minimum Sum 划分树,数据结构 难度:1的更多相关文章
- HDU 3473 Minimum Sum 划分树
题意: 给出一个长度为\(n(1 \leq n \leq 10^5)\)的序列\(a\) 有若干次查询l r:找到一个\(x\)使得\(\sum \limits_{l \leq i \leq r} \ ...
- HDU 3473 Minimum Sum (划分树求区间第k大带求和)(转)
题意:在区间中找一个数,求出该区间每个数与这个数距离的总和,使其最小 找的数字是中位数(若是偶数个,则中间随便哪个都可)接着找到该区间比此数大的数的总和 区间中位数可以使用划分树,然后在其中记录:每层 ...
- HDU 3473 Minimum Sum (划分树)
题意:给定一个数组,有Q次的询问,每次询问的格式为(l,r),表示求区间中一个数x,使得sum = sigma|x - xi|最小(i在[l,r]之间),输出最小的sum. 思路:本题一定是要O(nl ...
- HDU 3473 Minimum Sum(划分树)
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- hdu 3473 Minimum Sum
传送门 之前看挑战的时候看到一道分桶法的题目,其实我不是很明白分桶法应该怎么写.看到poj后面的讨论版上写着划分树裸题,而我以前就听说过了划分树,就干脆拿来学习一下.在写这篇博客的时候,其实我还是对这 ...
- HDU-3743 Minimum Sum,划分树模板
Minimum Sum 被这个题坑了一下午,原来只需找一个最中间的数即可,我以为是平均数. 题意:找一个数使得这个数和区间内所有数的差的绝对值最小.输出最小值. 开始用线段树来了一发果断T了,然后各种 ...
- hdu 3473 裸的划分树
思路: 用Sum[dep][i]记录从tree[po].l到i中进入左子树的和. #include<iostream> #include<algorithm> #include ...
- hdu 2665 Kth number(划分树模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2665 [ poj 2104 2761 ] 改变一下输入就可以过 http://poj.org/problem? ...
- 【HDOJ】3473 Minimum Sum
划分树解.主席树解MLE. /* 3473 */ #include <iostream> #include <sstream> #include <string> ...
随机推荐
- 跨域问题-jsonp
前端同源策略并不会拦截静态资源请求,那么就将接口伪装成资源,然后后端配合返回一个前端预定义的方法调用,将返回值放入调用该函数的形参即可 <!DOCTYPE html> <html l ...
- SCP命令只能单项拷贝,另一个方向“RSA host key for 172.16.103.176 has changed and you have requested strict checki Host key verification failed. lost connection”问题
[dinghuaneng@95 move_data]$ scp * dinghuaneng@172.16.103.176:/home/dinghuaneng@@@@@@@@@@@@@@@@@@@@@@ ...
- SSIS 2012 Error: An Integration Services class cannot be found
升级SSIS到SQL Server 2012,服务器只安装了SSIS一个功能,应用程序执行dtsx包时报错如下: An Integration Services class cannot be fou ...
- spring boot 使用属性加载顺序
1.命令行中传入的参数 2.SPRING_APPLICATION_JSON中的属性.SPRING_APPLICATION_JSON是以JSON格式配置再系统环境变量中的内容 3.java:comp/e ...
- APP接口版本不兼容怎么办? 教你一招
现在基本每个公司都做APP,所以大家都面临 APP接口版本兼容的问题. iOS和android 要不断开发新版本,很多服务端开发都是在以前接口的逻辑上进行修改.新的APP和接口开发后,接口如何兼容老的 ...
- markdown工作随笔总结
1. 锚点 (使用方法和链接很像) ## 目录 1. [命名](#命名) ....... **[返回顶部](#目录)** ## 命名 ###命名原则 可以从返回顶部回到目录,也可以点击目录的命名跳到命 ...
- Swift开发之泛型实例
一.Swift泛型 泛型能够让开发者编写自定义需求已经任意类型的灵活可用的的函数和类型.能够让我们避免重复的代码.用一种清晰和抽象的方式来表达代码的意图. func swapTwoStrings(_ ...
- ethtool命令详解
命令描述: ethtool 是用于查询及设置网卡参数的命令. 使用概要:ethtool ethx //查询ethx网口基本设置,其中 x 是对应网卡的编号,如eth0.eth1等等etht ...
- 数据结构实习 - problem M 判断平衡二叉树
writer:pprp date: 20171103 题目描述 给定一棵二叉树的中序和层序输出,判断是否为平衡二叉树的.如果是,输出YES如果不是输出NO. 输入 树结点个数 中序遍历序列 层序遍历序 ...
- class.getResource()和getResourceAsStream的用法
转自:http://blog.csdn.net/lcj8/article/details/3502849 class.getResource()的用法 用JAVA获取文件,听似简单,但对于很多像我这样 ...