hdu 3473 划分树
Minimum Sum
Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3611 Accepted Submission(s): 829
assmall as possible!
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 a blank line after everytest case.
5
3 6 2 2 4
2
1 4
0 2
2
7 7
2
0 1
1 1
6
4
Case #2:
0
0
题意:
给你一个区间,让你找出其中一个值,让所有值与它相减的绝对值的和最小。
思路:
于是成了找出其中的中间值减去最小,最开始简单粗暴地超时。然后发现求绝对值有点麻烦,于是在建树和查找的过程中找出比中间值小的数的和,然后分类计算吧。
感觉最开始没有考虑好方案,太随意了。
/*
hdu 3473
最开始直接算TL,然后发现由于是计算绝对值,在建树的时候需要记录比你查找的值小的和,
然后分开计算即可
*/ #include <functional>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <Map>
using namespace std;
typedef long long ll;
typedef long double ld; using namespace std; const int maxn = 100010; int tree[20][maxn];
int sorted[maxn];
int toleft[20][maxn];
ll sum[maxn];
ll lsum[20][maxn];
ll tsum; void build(int l,int r,int dep) //模拟快排 并记录左树中比i小的个数
{
if(l == r)
return;
int mid = (l+r)>>1;
int same = mid-l+1;//可能有很多值与中间那个相等,但不一定被分到左边
for(int i = l;i <= r;i++)
{
if(tree[dep][i] < sorted[mid])
same--;
}
int lpos = l;
int rpos = mid+1;
for(int i = l;i <= r;i++)
{
if(tree[dep][i] < sorted[mid]){
tree[dep+1][lpos++] = tree[dep][i];
lsum[dep][i] = lsum[dep][i-1] + tree[dep][i];
}
else if(tree[dep][i] == sorted[mid] && same > 0)
{
tree[dep+1][lpos++] = tree[dep][i];
lsum[dep][i] = lsum[dep][i-1] + tree[dep][i];
same --;
}
else
{
tree[dep+1][rpos++] = tree[dep][i];
lsum[dep][i] = lsum[dep][i-1];
}
toleft[dep][i] = toleft[dep][l-1] + lpos -l; }
build(l,mid,dep+1);
build(mid+1,r,dep+1);
} int query(int L,int R,int l,int r,int dep,int k)
{
if(l == r)
return tree[dep][l];
int mid = (L+R)>>1; int cnt = toleft[dep][r]-toleft[dep][l-1]; //所查找区间放在左树中的个数
if(cnt >= k)
{ //得到l左边放到左子树的个数,加上L即是开始位置
int lpos = L+toleft[dep][l-1]-toleft[dep][L-1];
int rpos = lpos+cnt-1; return query(L,mid,lpos,rpos,dep+1,k);
}
else
{ //R-r可以得出后面空出了多少位置
int rpos = r+toleft[dep][R]-toleft[dep][r];
int lpos = rpos-(r-l-cnt);
tsum += lsum[dep][r] - lsum[dep][l-1];
return query(mid+1,R,lpos,rpos,dep+1,k-cnt);
}
} int main()
{
int n,m,T;
int cas = 1;
scanf("%d",&T);
while(T--)
{ scanf("%d",&n);
for(int i = 1;i <= n;i++)
{
scanf("%d",&sorted[i]);
sum[i] = sum[i-1]+sorted[i];
tree[0][i] = sorted[i];
}
sort(sorted+1,sorted+n+1);
build(1,n,0);
scanf("%d",&m);
int l,r;
printf("Case #%d:\n",cas++);
while(m--)
{
scanf("%d%d",&l,&r);
l++;r++;tsum = 0;
ll k =(r-l)/2+1;
ll ans = 0;
ll aver = query(1,n,l,r,0,k);
ans = sum[r]-sum[l-1]-aver*(r-l+1-k)-tsum-aver;
ans += (k-1)*aver-tsum;
printf("%I64d\n",ans);
}
puts("");
}
return 0;
}
hdu 3473 划分树的更多相关文章
- HDU 4417 (划分树+区间小于k统计)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给定一个区间,以及一个k值,求该区间内小于等于k值的数的个数.注意区间是从0开始的 ...
- hdu 4251 划分树
思路:裸的划分树 #include<iostream> #include<algorithm> #include<cstdio> #include<cmath ...
- hdu 2665 划分树
思路:裸的划分树 #include<iostream> #include<algorithm> #include<cstring> #include<cstd ...
- hdu 4417 划分树
思路:二分枚举区间第k大.用划分树查找是否符合要求的高度. #include<iostream> #include<algorithm> #include<cstdio& ...
- HDU 4417 划分树写法
Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping ability re ...
- HDU 4417 划分树+二分
题意:有n个数.m个询问(l,r,k),问在区间[l,r] 有多少个数小于等于k. 划分树--查找区间第k大的数.... 利用划分树的性质.二分查找在区间[l,r]小于等于k的个数. 假设在区间第 i ...
- hdu 2665 划分树模板题(可作为模板)
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 3473 Minimum Sum 划分树,数据结构 难度:1
http://acm.hdu.edu.cn/showproblem.php?pid=3473 划分树模板题目,需要注意的是划分树的k是由1开始的 划分树: 参考:http://blog.csdn.ne ...
- HDU 3473 Minimum Sum (划分树)
题意:给定一个数组,有Q次的询问,每次询问的格式为(l,r),表示求区间中一个数x,使得sum = sigma|x - xi|最小(i在[l,r]之间),输出最小的sum. 思路:本题一定是要O(nl ...
随机推荐
- python自动发邮件
from email.header import Header from email.mime.text import MIMEText from email.utils import parsead ...
- 多种在线地图综合对比,Google,必应,arcgis Online...
不同网络地图的对比 天地图 坐标系:WGS84 地图配色: POI数量:丰富 有无建筑:有 地图特点:天地图按照国家标准进行配图,道路.水系.植被等图层用对应颜色渲染, POI信息丰富, ...
- JAVA_SE基础——68.RunTime类
RunTime类代表Java程序的运行时环境,每一个Java程序都有一个与之对应的Runtime实例,应用程序通过该对象与运行时环境相连,应用程序不能创建自己的Runtime实例,但可以通过getRu ...
- 解决忽略VScode中Python插件pylint报错的问题
pylint是VScode中python自带的插件,可以帮助代码规范,美观. 但是有些报错是你不想看到的,你可以选择性的忽略. 例如,在re.compile()中,可以添加参数re.S使. 匹配任意字 ...
- js判断操作系统windows,ios,android(笔记)
使用JS判断用户使用的系统是利用浏览器的userAgent. navigator.userAgent:userAgent 获取了浏览器用于 HTTP 请求的用户代理头的值. navigator.pla ...
- Mybatis框架入门
Mybaits框架 一.什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了googl ...
- MongoDb进阶实践之五 MongoDB修改命令详述
一.引言 上一篇文章我们已经详细介绍了MongoDB数据库的有关查询的内容,但是这只是所有查询命令的冰山一角.所有查询命令都写完也没有必要,我只是写了一些常用的命令,对MongoDB的 ...
- Mego开发文档 - 复杂查询
复杂查询 Mego 还支持一些更高级的LLINQ查询写法,本文只列出一部分. 分组汇总查询 using (var db = new OrderManageEntities()) { var query ...
- MQTT和paho(一)
参考链接:http://blog.csdn.net/yangzl2008/article/details/8861069 一.mqtt 1.简单介绍 http://mqtt.org/software ...
- C# WinForm 富文本编辑器 用kindeditor实现本地图片只选取不上传到编辑器
以下资料有参考网上其它童鞋作品,原作者看到务喷!!!! 以下资料有参考网上其它童鞋作品,原作者看到务喷!!!! 重要的事只要说两遍... 网上找了几天关于WinForm富文本编辑效果都不理想,各种坑, ...