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的更多相关文章

  1. HDU 3473 Minimum Sum 划分树

    题意: 给出一个长度为\(n(1 \leq n \leq 10^5)\)的序列\(a\) 有若干次查询l r:找到一个\(x\)使得\(\sum \limits_{l \leq i \leq r} \ ...

  2. HDU 3473 Minimum Sum (划分树求区间第k大带求和)(转)

    题意:在区间中找一个数,求出该区间每个数与这个数距离的总和,使其最小 找的数字是中位数(若是偶数个,则中间随便哪个都可)接着找到该区间比此数大的数的总和 区间中位数可以使用划分树,然后在其中记录:每层 ...

  3. HDU 3473 Minimum Sum (划分树)

    题意:给定一个数组,有Q次的询问,每次询问的格式为(l,r),表示求区间中一个数x,使得sum = sigma|x - xi|最小(i在[l,r]之间),输出最小的sum. 思路:本题一定是要O(nl ...

  4. HDU 3473 Minimum Sum(划分树)

    Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  5. hdu 3473 Minimum Sum

    传送门 之前看挑战的时候看到一道分桶法的题目,其实我不是很明白分桶法应该怎么写.看到poj后面的讨论版上写着划分树裸题,而我以前就听说过了划分树,就干脆拿来学习一下.在写这篇博客的时候,其实我还是对这 ...

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

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

  7. hdu 3473 裸的划分树

    思路: 用Sum[dep][i]记录从tree[po].l到i中进入左子树的和. #include<iostream> #include<algorithm> #include ...

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

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

  9. 【HDOJ】3473 Minimum Sum

    划分树解.主席树解MLE. /* 3473 */ #include <iostream> #include <sstream> #include <string> ...

随机推荐

  1. Django REST Framework 学习笔记

    前言: 基于一些不错的RESTful开发组件,可以快速的开发出不错的RESTful API,但如果不了解开发规范的.健壮的RESTful API的基本面,即便优秀的RESTful开发组件摆在面前,也无 ...

  2. Error: registers may not be the same -- `strexb r3,r2,[r3]'

    tmp\ccFziEge.s:914: Error: registers may not be the same -- `strexb r3,r2,[r3]'tmp\ccFziEge.s:968: E ...

  3. Winter-1-C A + B II 解题报告及测试数据

    Time Limit:1000MS Memory Limit:32768KB Description I have a very simple problem for you. Given two i ...

  4. 理解js的DOM操作

    1.DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动.document.documentElement     返回文档的根节点<html> document.body ...

  5. TOSCA自动化测试工具--openURL

    在folder下面create test case 输入自己的url,actionMode 是input, String类型

  6. 前端隐藏Ios及安卓滚动条

    1.方法不通用 // .scroll_list::-webkit-scrollbar { display:none } .scroll_list::-webkit-scrollbar-track { ...

  7. 基于JWT的token身份认证方案

    一.使用JSON Web Token的好处? 1.性能问题. JWT方式将用户状态分散到了客户端中,相比于session,可以明显减轻服务端的内存压力. Session方式存储用户id的最大弊病在于S ...

  8. java并发再次积累

    监视器与锁之间的关系: 1.object monitor 是任何一个对象都有的内置的数据结构,它是用来协调使用当前对象的多个线程之间的执行顺序的(wait/notify),线程会block或者wait ...

  9. An Example for Javascript Function Scoping and Closure

    1. An Real World Example In the patron detail page of the CRM system I'm working with, there’re larg ...

  10. 多线程资源隔离之ThreadLocal

    上篇讲到多线程线程安全问题的解决思路,这篇将详细讲解资源隔离ThreadLocal的实践. ThreadLocal也叫线程局部变量,类似Map结构,以当前线程为key.既然是以资源隔离的思想保证线程安 ...