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> ...
随机推荐
- 命令查看java的class字节码文件
源代码: public class Math { public static void main(String[] args){ int a=1; int b=2; int c=(a+b)*10; } ...
- python3.5实现购物车
一.购物车实现: 购物车功能: 用户登录:密码错误三次锁定账户. 商品列表分页显示:输入页码查看指定页数商品信息. 已购买商品列表:显示已购买的物品列表:可以模糊查询已购买的商品并在终端打印. 充值: ...
- json转List、Map
import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Li ...
- Android事件处理下(按键、触摸屏和滚动球的一些实现细节)
http://www.cnblogs.com/andtt/articles/2145563.html 对于按键事件,调用mDevices[i]->layoutMap->map进行映射.映射 ...
- TCP/IP原理简述
TCP/IP与OSI TCP/IP工作在第4层,在TCP/IP协议簇中,有两个不同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议),它们分别承载不同的应用.TCP协议提供可靠的服务,UDP ...
- android - Session 'app': Error Installing APK
File->Settings->Build,Execuion,Deployment->Instant Run 然后把Enable Instant Run to...那一项的勾去掉就好 ...
- TCP/IP 传输原理
TCP传输原理简单说明 TCP传输需要经过3次握手4次挥手. 三次握手 当客户端向服务端进行连接时,会发送一个SYN报文,请求服务端监听端口,服务端确认请求后,会向客户端发送ACK确认,客户端 ...
- python---自动群发邮件
生活中我们经常发送邮件,那么我们能不能用Python写一个自动发送邮件的功能呢?答案是肯定的!!! 开始实现功能之前我们需要开启我们邮箱的 IMAP/SMTP功能,我们先了解一下什么是IMAP/SMT ...
- 照着官网来安装openstack pike之neutron安装
neutron组件安装分为控制节点和计算节点,还是先从控制节点安装 1.前提条件,数据库为nova创建库和账户密码来连接数据库 # mysql -u root -p MariaDB [(none)]& ...
- 20145333茹翔 《Java程序设计》实验四 实验报告
实验要求 完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等).解决办法(空洞的方法如"查网络&q ...