HDU 3473
分析可知,最优的x应该在区间中的数排列后最中间的地方选择。由于区间的数个数有奇偶之分,于是当奇数个时,就是中位数了。偶数个时,就是排列后中间两数区间的任意一个。
可以应用划分树求得前半部分,树状数组统计。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL __int64
#define lowbit(x) (x&(-x))
using namespace std; const int N=100050;
int sorted[N],n,m;
struct node{
int val[N];
int num[N];
LL sum[N];
}tp[20];
LL ANS;
LL arrayTree[N]; void build(int lft,int rht,int p){
if(lft==rht) return ;
int i,mid=(lft+rht)/2;
int isame=mid-lft+1,same=0;
for(i=lft;i<=rht;i++){
if(tp[p].val[i]<sorted[mid]) isame--;
}
int ln=lft,rn=mid+1;
for(i = lft; i <= rht; i++) {
if(i == lft) {
tp[p].num[i] = 0;
tp[p].sum[i]=0;
} else {
tp[p].num[i] = tp[p].num[i-1];
tp[p].sum[i]=tp[p].sum[i-1];
}
if(tp[p].val[i] < sorted[mid]) {
tp[p].num[i]++;
tp[p].sum[i]+=tp[p].val[i];
tp[p+1].val[ln++] = tp[p].val[i];
}else if(tp[p].val[i] > sorted[mid]) {
tp[p+1].val[rn++] = tp[p].val[i];
}else {
if(same < isame) {
same++;
tp[p].num[i]++;
tp[p].sum[i]+=tp[p].val[i];
tp[p+1].val[ln++] = tp[p].val[i];
}else {
tp[p+1].val[rn++] = tp[p].val[i];
}
}
}
build(lft, mid, p+1);
build(mid+1, rht, p+1);
} int query(int a, int b, int k, int p, int lft, int rht) {
if(lft == rht) {
return tp[p].val[a];
}
LL sss=0;
int s, ss, b2, bb, mid = (lft+rht)/2;
if(a == lft) {
s = tp[p].num[b];
ss = 0;
sss=tp[p].sum[b];
} else {
s = tp[p].num[b] - tp[p].num[a-1];
ss = tp[p].num[a-1];
sss=tp[p].sum[b]-tp[p].sum[a-1];
}
if(s >= k) {
a = lft + ss;
b = lft + ss + s - 1;
return query(a, b, k, p+1, lft, mid);
} else {
bb = a - lft - ss;
b2 = b - a + 1 - s;
a = mid + bb + 1;
b = mid + bb + b2;
ANS+=sss;
return query(a, b, k-s,p+1, mid+1, rht);
}
} void update(int i,int w){
for(int k=i;k<=n;k+=lowbit(k)){
arrayTree[k]+=w;
}
} LL arraySum(int index){
if(index==0) return 0;
LL ret=0;
for(int i=index;i>=1;i-=lowbit(i))
ret+=arrayTree[i];
return ret;
} LL getsum(int l,int r){
// cout<<arraySum(r)<<endl;
return arraySum(r)-arraySum(l-1);
} int main(){
int T,Case=0;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(arrayTree,0,sizeof(arrayTree));
for(int i=1;i<=n;i++){
scanf("%d",&tp[0].val[i]);
sorted[i]=tp[0].val[i];
update(i,sorted[i]);
}
ANS=0;
sort(sorted+1,sorted+1+n);
build(1,n,0);
scanf("%d",&m);
int l,r;
printf("Case #%d:\n",++Case);
for(int i=1;i<=m;i++){
scanf("%d%d",&l,&r);
l++,r++;
LL spre=getsum(l,r);
ANS=0;
if((r-l+1)%2==0){
int mid=query(l,r,(r-l+1)/2+1,0,1,n);
printf("%I64d\n",spre-ANS-ANS);
}
else{
int mid=query(l,r,(r-l+1)/2+1,0,1,n);
printf("%I64d\n",spre-ANS-ANS-mid);
}
}
puts("");
}
return 0;
}
HDU 3473的更多相关文章
- hdu 3473 划分树
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- 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 区间条件极值 - 区间 差的绝对值 之和的最小
题目传送门//res tp hdu 目的 对长度为n的区间,给定q个子区间,求一x,使得区间内所有元素与x的差的绝对值之和最小. 多测. n 1e5 q 1e5 ai [1,1e9] (i∈[1,n] ...
- hdu 3473 裸的划分树
思路: 用Sum[dep][i]记录从tree[po].l到i中进入左子树的和. #include<iostream> #include<algorithm> #include ...
- HDU 3473 Minimum Sum (划分树)
题意:给定一个数组,有Q次的询问,每次询问的格式为(l,r),表示求区间中一个数x,使得sum = sigma|x - xi|最小(i在[l,r]之间),输出最小的sum. 思路:本题一定是要O(nl ...
- HDU 3473 Minimum Sum(划分树)
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- hdu 3473 (划分树)2
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- 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} \ ...
随机推荐
- HDU 3007 最小圆覆盖 计算几何
思路: 随机增量法 (好吧这数据范围并不用) //By SiriusRen #include <cmath> #include <cstdio> #include <al ...
- scrapy框架简介和基础应用(python爬虫)
一.什么是scrapy? scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍,所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,持久化等)的具有 ...
- 微信接口本地调试(IIS服务器)
1.下载ngrok,并注册获得token.官网下载地址:https://ngrok.com/ 如果你是在官网下载的,到后面映射域名的时候会要求购买他们的服务. 这里我们用一个国内免费的ngrok服务器 ...
- cocos2dx实现单机版三国杀(二)
接上续,东西还没有做完 所以代码免不了改动 之前的头文件现在又改了不少,因为架构也改变了现在主要类就是GameScene.GameUI.PlayInfo.Poker这四个类 前面想的GameLoop ...
- iis设置404错误页,返回500状态码
一般在II6下,设置自定义404错误页时,只需要在错误页中选择自定义的页面,做自己的404页面即可.但是在IIS7.0及以上时,设置完404错误页后,会发现状态码返回的是500,并且可能会引起页面乱码 ...
- 3星|《IBM商业价值报告:区块链》:一些重要行业对区块链的态度和已经发生的区块链的应用
区块链项目开发指南 (区块链技术丛书) 介绍IBM的专家们调研许多重要行业与组织后总结的各行业对区块链的态度和实际的应用.看起来有点意思,不过有两个缺点: 1:这些实际已经发生的应用基本没看到相关的新 ...
- java实例1
1.满天星星 import java.awt.*; public class xinxin { public static void main(String[] args) { Frame w = n ...
- .net core里用ZXing生成二维码
先获取Nuget包 static void Main(string[] args) { string content = "二维码信息"; BitMatrix byteMatrix ...
- windows设置右键菜单
1. 打开注册表,(win + R,输入regedit) 2. 在 HKEY_CLASSES_ROOT\Directory\Background\shell 中,新建项:如(cmder),在 cmde ...
- 洛谷——P1759 通天之潜水
P1759 通天之潜水 题目背景 直达通天路·小A历险记第三篇 题目描述 在猴王的帮助下,小A终于走出了这篇荒山,却发现一条波涛汹涌的河拦在了自己的面前.河面上并没有船,但好在小A有n个潜水工具. ...