# Minimum Sum

Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3084    Accepted Submission(s): 710

Problem Description
You are given N positive integers, denoted as x0, x1 ... xN-1. Then give you some intervals [l, r]. For each interval, you need to find a number x to make as small as possible!

Input
The first line is an integer T (T <= 10), indicating the number of test cases. For each test case, an integer N (1 <= N <= 100,000) comes first. Then comes N positive integers x (1 <= x <= 1,000, 000,000) in the next line. Finally, comes an integer Q (1 <= Q <= 100,000), indicting there are Q queries. Each query consists of two integers l, r (0 <= l <= r < N), meaning the interval you should deal with.

Output
For the k-th test case, first output “Case #k:” in a separate line. Then output Q lines, each line is the minimum value of . Output a blank line after every test case.

Sample Input
2

5
3 6 2 2 4
2
1 4
0 2

2
7 7
2
0 1
1 1

Sample Output
Case #1:
6
4

Case #2:
0
0

另外需要注意的是，，这道题对内存要求的比较紧，，数组不能太大。

#include <cstring>
#include <algorithm>
#define MAX 100100

using namespace std ;

long long sum[25][MAX];
int sorted[MAX] , tree[25][MAX] ,toLeft[25][MAX] ;
void creat(int L , int R , int deep)
{
if(L == R)
{
sum[deep][L]=tree[deep][L] ;
return ;
}
int mid = (L+R)>>1 , same = mid-L+1;

for(int i = L ; i <= R ; ++i)
{
if(tree[deep][i]<sorted[mid])
--same ;
sum[deep][i] = tree[deep][i] ;
if(i>L)	sum[deep][i] += sum[deep][i-1] ;
}
int ls = L ,rs = mid+1;
for(int i = L ; i <= R ; ++i)
{
int flag = 0 ;
long long num = 0;
if(tree[deep][i]<sorted[mid] || (tree[deep][i]==sorted[mid] && same))
{
tree[deep+1][ls++]=tree[deep][i] ;
if(tree[deep][i] == sorted[mid])
--same ;
flag = 1 ;
}
else
{
tree[deep+1][rs++] = tree[deep][i] ;
}
toLeft[deep][i] = toLeft[deep][i-1]+flag ;
}
creat(L,mid,deep+1) ;
creat(mid+1,R,deep+1) ;
}
long long ans = 0;
int query(int L , int R , int x , int y , int k , int deep)
{
if(x == y)
{
return tree[deep][x] ;
}
int  mid = (L+R)>>1;
int lxl = toLeft[deep][x-1] - toLeft[deep][L-1] ;
int lyl = toLeft[deep][y] - toLeft[deep][L-1] ;
int xyl = toLeft[deep][y] - toLeft[deep][x-1] ;
int lxr = x-L-lxl ;
int lyr = y-L+1-(toLeft[deep][y]-toLeft[deep][L-1]) ;

if(k<=xyl)
{
if(lyr>0)
{
if(lxr>0)
{
ans += sum[deep+1][mid+lyr]-sum[deep+1][mid+lxr];
}
else
{
ans += sum[deep+1][mid+lyr] ;
}
}
return query(L,mid,L+lxl,L+lyl-1,k,deep+1);
}
else
{
if(lyl>0)
{
if(lxl>0)	ans-=sum[deep+1][L+lyl-1]-sum[deep+1][L+lxl-1];
else	ans -= sum[deep+1][L+lyl-1] ;
}
return query(mid+1,R,mid+lxr+1,mid+lyr,k-xyl,deep+1);
}

}

int main()
{
int t ;
scanf("%d",&t);
for(int i = 1 ; i <= t ; ++i)
{
int n ;
scanf("%d",&n);
memset(toLeft,0,sizeof(toLeft)) ;
for(int j = 1 ; j <= n ; ++j)
{
scanf("%d",&sorted[j]) ;
tree[0][j] = sorted[j] ;
}
sort(sorted+1 , sorted+n+1) ;
creat(1,n,0) ;
int r ;
printf("Case #%d:\n",i) ;
scanf("%d",&r) ;
for(int j = 0 ; j < r ; ++j)
{
int l,ri;
scanf("%d%d",&l,&ri) ;
++l,++ri;
int k = (ri-l)/2+1;
ans = 0 ;
int d = query(1,n,l,ri,k,0);
if((ri-l+1)%2 == 0)
{
ans -= d ;
}
printf("%I64d\n",ans);
}
printf("\n") ;
}
return 0 ;
}

• 本文已收录于以下专栏：

## HDU 3473 Minimum Sum （划分树）

• 2013年09月06日 15:30
• 720

## Minimum Sum - HDU 3473 划分树

Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T...
• u014733623
• 2015年07月11日 15:11
• 339

## HDU 3473 Minimum Sum 划分树

• discreeter
• 2016年05月17日 23:19
• 236

## hdu 3473 Minimum Sum 划分树

http://acm.hdu.edu.cn/showproblem.php?pid=3473 题意：给定一个数组，有Q次的询问，每次询问的格式为(l,r)，表示寻找一个x，使得的值最小。N 思路：...
• ivan_zjj
• 2012年04月11日 09:09
• 663

## hdu 3473 Minimum Sum（划分树）

Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T...
• u011699990
• 2015年11月12日 17:53
• 292

## HDU 3473 Minimum Sum 划分树

• PoPoQQQ
• 2014年09月24日 15:12
• 1160

## hdu 3473 Minimum Sum(划分树-sum操作)

• u010697167
• 2014年05月14日 13:11
• 745

## HDU - 3473 Minimum Sum（划分树模板）

Minimum Sum   Problem Description You are given N positive integers, denoted as x0, x1 ... xN-1. ...
• lzc504603913
• 2017年10月23日 21:42
• 59

## 【划分树】 HDU 3473 Minimum Sum 中位数

• u012749539
• 2015年08月03日 14:49
• 385

## hdu 3473 Minimum Sum 划分树的应用

• u013532224
• 2015年08月04日 09:32
• 441

举报原因： 您举报文章：hdu 3473 Minimum Sum 再来一波划分树，对划分树累觉不爱。 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)