划分树,统计每层移到左边的数的和.

Minimum Sum

Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 2959    Accepted Submission(s): 684

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
  1. 2
  2. 5
  3. 3 6 2 2 4
  4. 2
  5. 1 4
  6. 0 2
  7. 2
  8. 7 7
  9. 2
  10. 0 1
  11. 1 1
 
Sample Output
  1. Case #1:
  2. 6
  3. 4
  4. Case #2:
  5. 0
  6. 0
 
Author
standy
 
Source
 

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. const int maxn=100010;
  9.  
  10. typedef long long int LL;
  11.  
  12. int tree[18][maxn];
  13. LL sumL[18][maxn];
  14. int sorted[maxn];
  15. int toleft[18][maxn];
  16.  
  17. void build(int l,int r,int dep)
  18. {
  19. if(l==r) return ;
  20. int mid=(l+r)/2;
  21. int same=mid-l+1;
  22. for(int i=l;i<=r;i++)
  23. if(tree[dep][i]<sorted[mid]) same--;
  24. int lpos=l,rpos=mid+1;
  25. for(int i=l;i<=r;i++)
  26. {
  27. if(tree[dep][i]<sorted[mid])
  28. {
  29. tree[dep+1][lpos++]=tree[dep][i];
  30. sumL[dep][i]=sumL[dep][i-1]+tree[dep][i];
  31. }
  32. else if(tree[dep][i]==sorted[mid]&&same>0)
  33. {
  34. tree[dep+1][lpos++]=tree[dep][i];
  35. sumL[dep][i]=sumL[dep][i-1]+tree[dep][i];
  36. same--;
  37. }
  38. else
  39. {
  40. tree[dep+1][rpos++]=tree[dep][i];
  41. sumL[dep][i]=sumL[dep][i-1];
  42. }
  43. toleft[dep][i]=toleft[dep][l-1]+lpos-l;
  44. }
  45. build(l,mid,dep+1); build(mid+1,r,dep+1);
  46. }
  47.  
  48. LL SUMOFLEFT,NUMOFLEFT;
  49.  
  50. LL query(int L,int R,int l,int r,int dep,int k)
  51. {
  52. if(l==r) return tree[dep][l];
  53. int mid=(L+R)/2;
  54. int cnt=toleft[dep][r]-toleft[dep][l-1];
  55. if(cnt>=k)
  56. {
  57. int newl=L+toleft[dep][l-1]-toleft[dep][L-1];
  58. int newr=newl+cnt-1;
  59. return query(L,mid,newl,newr,dep+1,k);
  60. }
  61. else
  62. {
  63. SUMOFLEFT+=sumL[dep][r]-sumL[dep][l-1];
  64. NUMOFLEFT+=cnt;
  65.  
  66. int newr=r+toleft[dep][R]-toleft[dep][r];
  67. int newl=newr-(r-l-cnt);
  68. return query(mid+1,R,newl,newr,dep+1,k-cnt);
  69. }
  70. }
  71.  
  72. int n,m;
  73. LL sum[maxn];
  74.  
  75. int main()
  76. {
  77. int T_T,cas=1;
  78. scanf("%d",&T_T);
  79. while(T_T--)
  80. {
  81. scanf("%d",&n);
  82. for(int i=1;i<=n;i++)
  83. {
  84. scanf("%d",sorted+i);
  85. tree[0][i]=sorted[i];
  86. sum[i]=sum[i-1]+sorted[i];
  87. }
  88. sort(sorted+1,sorted+1+n);
  89. build(1,n,0);
  90. scanf("%d",&m);
  91. printf("Case #%d:\n",cas++);
  92. while(m--)
  93. {
  94. int l,r,k;
  95. scanf("%d%d",&l,&r);
  96. l++; r++;
  97. k=(l+r)/2-l+1;
  98. SUMOFLEFT=0;NUMOFLEFT=0;
  99. LL ave=query(1,n,l,r,0,k);
  100. printf("%I64d\n",(sum[r]-sum[l-1]-SUMOFLEFT)-SUMOFLEFT+(NUMOFLEFT-(r-l+1-NUMOFLEFT))*ave);
  101. }
  102. putchar(10);
  103. }
  104. return 0;
  105. }

HDOJ 3473 Minimum Sum的更多相关文章

  1. HDU 3473 Minimum Sum(划分树)

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

  2. 【HDOJ】3473 Minimum Sum

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

  3. HDU 3473 Minimum Sum 划分树,数据结构 难度:1

    http://acm.hdu.edu.cn/showproblem.php?pid=3473 划分树模板题目,需要注意的是划分树的k是由1开始的 划分树: 参考:http://blog.csdn.ne ...

  4. hdu 3473 Minimum Sum

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

  5. HDU 3473 Minimum Sum (划分树)

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

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

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

  7. HDU 3473 Minimum Sum 划分树

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

  8. 逆序数2 HDOJ 1394 Minimum Inversion Number

    题目传送门 /* 求逆序数的四种方法 */ /* 1. O(n^2) 暴力+递推 法:如果求出第一种情况的逆序列,其他的可以通过递推来搞出来,一开始是t[1],t[2],t[3]....t[N] 它的 ...

  9. 数学 - Whu 1603 - Minimum Sum

    Minimum Sum Problem's Link ------------------------------------------------------------------------- ...

随机推荐

  1. Material Design (二),TextInputLayout的使用

    前言  一般登录注冊界面都须要EditText这个控件来让用户输入信息,同一时候我们通常会设置一个标签(使用TextView)和EditText的hint属性来提示用户输入的内容,而设计库中高级组件T ...

  2. 微信小程序 之 请求函数封装

    封装的request的代码 /** * @desc API请求接口类封装 */ /** * POST请求API * @param {String} url 接口地址 * @param {Object} ...

  3. react-native 项目实战 -- 新闻客户端(5) -- 完善首页列表数据

    1.Home.js: /** * 首页 */ import React, { Component } from 'react'; import { AppRegistry, StyleSheet, T ...

  4. ping百度不通的解决方案

    1.ping  www.baidu.com unknow baidu.com 第一步,确定是否能ping通网关 第二步,确定是否能直接ping通外网 如ping 8.8.8.8 第三步,如果上面两个都 ...

  5. lodash 数组裁剪 drop

    _.drop(array, [n=1]) 裁剪数组中的前 N 个数组,返回剩余的部分. <!DOCTYPE html> <html lang="zh"> & ...

  6. TCP应用程序通信协议的处理

    TCP应用程序通信协议的处理 flyfish 2015-6-29 一 流式处理 TCP是一种流协议(stream protocol).TCP数据是以字节流的形式传递给接收者的,没有固有的"报 ...

  7. Java Learning Path(三)过程篇

    Java Learning Path(三)过程篇 每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法.因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基 ...

  8. C#开发--FTP操作方法管理

    1.整理简化了下C#的ftp操作,方便使用    1.支持创建多级目录    2.批量删除    3.整个目录上传    4.整个目录删除    5.整个目录下载 2.调用方法展示, var ftp ...

  9. 15个私有云上的 DevOps 开源工具

    原文:http://www.sohu.com/a/136276885_262549 在可维护性,可靠性,效率和安全性方面,DevOps 为私有云在改进操作流程方面发挥着重要的作用.私有云是一个由许多硬 ...

  10. python常见面试题(二)

    1. 到底什么是Python?你可以在回答中与其他技术进行对比(也鼓励这样做). 下面是一些关键点: Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需 ...