HDOJ 3473 Minimum Sum
划分树,统计每层移到左边的数的和.
Minimum Sum
Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2959 Accepted Submission(s): 684

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.

2 5 3 6 2 2 4 2 1 4 0 2 2 7 7 2 0 1 1 1
Case #1: 6 4 Case #2: 0 0
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int maxn=100010;
- typedef long long int LL;
- int tree[18][maxn];
- LL sumL[18][maxn];
- int sorted[maxn];
- int toleft[18][maxn];
- void build(int l,int r,int dep)
- {
- if(l==r) return ;
- int mid=(l+r)/2;
- int same=mid-l+1;
- for(int i=l;i<=r;i++)
- if(tree[dep][i]<sorted[mid]) same--;
- int lpos=l,rpos=mid+1;
- for(int i=l;i<=r;i++)
- {
- if(tree[dep][i]<sorted[mid])
- {
- tree[dep+1][lpos++]=tree[dep][i];
- sumL[dep][i]=sumL[dep][i-1]+tree[dep][i];
- }
- else if(tree[dep][i]==sorted[mid]&&same>0)
- {
- tree[dep+1][lpos++]=tree[dep][i];
- sumL[dep][i]=sumL[dep][i-1]+tree[dep][i];
- same--;
- }
- else
- {
- tree[dep+1][rpos++]=tree[dep][i];
- sumL[dep][i]=sumL[dep][i-1];
- }
- toleft[dep][i]=toleft[dep][l-1]+lpos-l;
- }
- build(l,mid,dep+1); build(mid+1,r,dep+1);
- }
- LL SUMOFLEFT,NUMOFLEFT;
- LL query(int L,int R,int l,int r,int dep,int k)
- {
- if(l==r) return tree[dep][l];
- int mid=(L+R)/2;
- int cnt=toleft[dep][r]-toleft[dep][l-1];
- if(cnt>=k)
- {
- int newl=L+toleft[dep][l-1]-toleft[dep][L-1];
- int newr=newl+cnt-1;
- return query(L,mid,newl,newr,dep+1,k);
- }
- else
- {
- SUMOFLEFT+=sumL[dep][r]-sumL[dep][l-1];
- NUMOFLEFT+=cnt;
- int newr=r+toleft[dep][R]-toleft[dep][r];
- int newl=newr-(r-l-cnt);
- return query(mid+1,R,newl,newr,dep+1,k-cnt);
- }
- }
- int n,m;
- LL sum[maxn];
- int main()
- {
- int T_T,cas=1;
- scanf("%d",&T_T);
- while(T_T--)
- {
- scanf("%d",&n);
- for(int i=1;i<=n;i++)
- {
- scanf("%d",sorted+i);
- tree[0][i]=sorted[i];
- sum[i]=sum[i-1]+sorted[i];
- }
- sort(sorted+1,sorted+1+n);
- build(1,n,0);
- scanf("%d",&m);
- printf("Case #%d:\n",cas++);
- while(m--)
- {
- int l,r,k;
- scanf("%d%d",&l,&r);
- l++; r++;
- k=(l+r)/2-l+1;
- SUMOFLEFT=0;NUMOFLEFT=0;
- LL ave=query(1,n,l,r,0,k);
- printf("%I64d\n",(sum[r]-sum[l-1]-SUMOFLEFT)-SUMOFLEFT+(NUMOFLEFT-(r-l+1-NUMOFLEFT))*ave);
- }
- putchar(10);
- }
- return 0;
- }
HDOJ 3473 Minimum Sum的更多相关文章
- HDU 3473 Minimum Sum(划分树)
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- 【HDOJ】3473 Minimum Sum
划分树解.主席树解MLE. /* 3473 */ #include <iostream> #include <sstream> #include <string> ...
- HDU 3473 Minimum Sum 划分树,数据结构 难度:1
http://acm.hdu.edu.cn/showproblem.php?pid=3473 划分树模板题目,需要注意的是划分树的k是由1开始的 划分树: 参考:http://blog.csdn.ne ...
- hdu 3473 Minimum Sum
传送门 之前看挑战的时候看到一道分桶法的题目,其实我不是很明白分桶法应该怎么写.看到poj后面的讨论版上写着划分树裸题,而我以前就听说过了划分树,就干脆拿来学习一下.在写这篇博客的时候,其实我还是对这 ...
- HDU 3473 Minimum Sum (划分树)
题意:给定一个数组,有Q次的询问,每次询问的格式为(l,r),表示求区间中一个数x,使得sum = sigma|x - xi|最小(i在[l,r]之间),输出最小的sum. 思路:本题一定是要O(nl ...
- HDU 3473 Minimum Sum (划分树求区间第k大带求和)(转)
题意:在区间中找一个数,求出该区间每个数与这个数距离的总和,使其最小 找的数字是中位数(若是偶数个,则中间随便哪个都可)接着找到该区间比此数大的数的总和 区间中位数可以使用划分树,然后在其中记录:每层 ...
- HDU 3473 Minimum Sum 划分树
题意: 给出一个长度为\(n(1 \leq n \leq 10^5)\)的序列\(a\) 有若干次查询l r:找到一个\(x\)使得\(\sum \limits_{l \leq i \leq r} \ ...
- 逆序数2 HDOJ 1394 Minimum Inversion Number
题目传送门 /* 求逆序数的四种方法 */ /* 1. O(n^2) 暴力+递推 法:如果求出第一种情况的逆序列,其他的可以通过递推来搞出来,一开始是t[1],t[2],t[3]....t[N] 它的 ...
- 数学 - Whu 1603 - Minimum Sum
Minimum Sum Problem's Link ------------------------------------------------------------------------- ...
随机推荐
- Material Design (二),TextInputLayout的使用
前言 一般登录注冊界面都须要EditText这个控件来让用户输入信息,同一时候我们通常会设置一个标签(使用TextView)和EditText的hint属性来提示用户输入的内容,而设计库中高级组件T ...
- 微信小程序 之 请求函数封装
封装的request的代码 /** * @desc API请求接口类封装 */ /** * POST请求API * @param {String} url 接口地址 * @param {Object} ...
- react-native 项目实战 -- 新闻客户端(5) -- 完善首页列表数据
1.Home.js: /** * 首页 */ import React, { Component } from 'react'; import { AppRegistry, StyleSheet, T ...
- ping百度不通的解决方案
1.ping www.baidu.com unknow baidu.com 第一步,确定是否能ping通网关 第二步,确定是否能直接ping通外网 如ping 8.8.8.8 第三步,如果上面两个都 ...
- lodash 数组裁剪 drop
_.drop(array, [n=1]) 裁剪数组中的前 N 个数组,返回剩余的部分. <!DOCTYPE html> <html lang="zh"> & ...
- TCP应用程序通信协议的处理
TCP应用程序通信协议的处理 flyfish 2015-6-29 一 流式处理 TCP是一种流协议(stream protocol).TCP数据是以字节流的形式传递给接收者的,没有固有的"报 ...
- Java Learning Path(三)过程篇
Java Learning Path(三)过程篇 每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法.因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基 ...
- C#开发--FTP操作方法管理
1.整理简化了下C#的ftp操作,方便使用 1.支持创建多级目录 2.批量删除 3.整个目录上传 4.整个目录删除 5.整个目录下载 2.调用方法展示, var ftp ...
- 15个私有云上的 DevOps 开源工具
原文:http://www.sohu.com/a/136276885_262549 在可维护性,可靠性,效率和安全性方面,DevOps 为私有云在改进操作流程方面发挥着重要的作用.私有云是一个由许多硬 ...
- python常见面试题(二)
1. 到底什么是Python?你可以在回答中与其他技术进行对比(也鼓励这样做). 下面是一些关键点: Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需 ...