hdu 3473 (划分树)2
Minimum Sum
Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4611 Accepted Submission(s): 1046
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
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
const int maxn = 1e5 + ;
int sorted[maxn];
int num[][maxn], val[][maxn];
LL sum[][maxn]; void build(int l, int r, int dep) {
if (l == r) {
sum[dep][l] = sum[dep][l - ] + val[dep][l];
return ;
}
int mid = (l + r) >> , same = mid - l + ;
for (int i = l ; i <= r ; i++) {
if (val[dep][i] < sorted[mid]) same--;
sum[dep][i] += sum[dep][i - ] + val[dep][i];
}
int lpos = l, rpos = mid + ;
for (int i = l ; i <= r ; i++) {
if (val[dep][i] < sorted[mid]) val[dep + ][lpos++] = val[dep][i];
else if (val[dep][i] == sorted[mid] && same > ) {
val[dep + ][lpos++] = val[dep][i];
same--;
} else val[dep + ][rpos++] = val[dep][i];
num[dep][i] = num[dep][l - ] + lpos - l;
}
build(l, mid, dep + ) ;
build(mid + , r, dep + );
}
LL ans; int query(int L, int R, int l, int r, int dep, int k) {
if (l == r) return val[dep][l];
int mid = (L + R) >> ;
int cnt = num[dep][r] - num[dep][l - ];
if (cnt >= k) {
int ee = r - L + - (num[dep][r] - num[dep][L - ]) + mid;
int ss = l - L - (num[dep][l - ] - num[dep][L - ]) + mid;
ans += sum[dep + ][ee] - sum[dep + ][ss];
int newl = L + num[dep][l - ] - num[dep][L - ];
int newr = newl + cnt - ;
return query(L, mid, newl, newr, dep + , k);
} else {
int s = L + num[dep][l - ] - num[dep][L - ];
int e = s + cnt - ;
ans -= sum[dep + ][e] - sum[dep + ][s - ];
int newr = r + num[dep][R] - num[dep][r];
int newl = newr - (r - l + - cnt) + ;
return query(mid + , R, newl, newr, dep + , k - cnt);
}
} int main() {
int t, n, cas = , m, l, r;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
memset(val, , sizeof(val));
memset(sum, , sizeof(sum));
for (int i = ; i <= n ; i++) {
scanf("%d", &val[][i]);
sorted[i] = val[][i];
}
sort(sorted + , sorted + n + );
build(, n, );
printf("Case #%d:\n", cas++);
scanf("%d", &m);
while(m--) {
scanf("%d%d", &l, &r);
ans = ;
l++, r++;
int temp = query(, n, l, r, , (l + r) / - l + );
if ((l + r) % ) ans -= temp;
printf("%lld\n", ans);
}
printf("\n");
}
return ;
}
hdu 3473 (划分树)2的更多相关文章
- hdu 3473 划分树
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- 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 ...
随机推荐
- linux文件操作篇 (一)文件属性与权限
文件的属性和权限是linux中 目录 和 文件 的两个基本特性. #属性: . 所有者属性 . 访问权限属性 -rwxrwxr-x #第一个字符是文件类别 -表示 普通文件 d 表示目录 b 表示 ...
- 实验7 shell程序设计二(1)
编写一个shell过程完成如下功能(必须在脚本中使用函数)1.程序接收3个参数:$1/$2和$3,合并两个文件$1/$2为$3,并显示,三个文件均为文本文件.2.如果文件$3不存在,那么先报告缺少$3 ...
- [Cracking the Coding Interview] 4.5 Validate BST
Implement a function to check if a binary tree is a binary search tree. 这道题很经典,让我们判断一棵树是不是二叉查找树.但是首先 ...
- python2.7练习小例子(十八)
19):题目:一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数. #!/usr/bin/python # -*- ...
- spark优化系列一:参数介绍
1 spark on yarn常用属性介绍 属性名 默认值 属性说明 spark.yarn.am.memory 512m 在客户端模式(client mode)下,yarn应用master使用的内存数 ...
- Java:位移运算符
Java中有三个位移运算符,用于对int类型整数的二进制补码进行操作: 1. "<<": 左移运算符 在二进制补码末尾添加“0”,之前的其他位相当于左移了一位,可看作成 ...
- netty学习记录2
昨天晚上在看到7.2章MessagePack编码器和解码器开发这一章时,书里面没有贴出全部的代码,然后我按照我自己的想法把代码补全后,发现死活没有把代码跑通. 然后花了挺多时间在网上找,很多博客都贴出 ...
- MySQL数据库服务器逐渐变慢分析
第一步 检查系统的状态 1.1 使用sar来检查操作系统是否存在IO问题 #sar -u 2 10 — 即每隔2秒检察一次,共执行20次. [root@CacheMemCache tester]# s ...
- Spring研磨分析、Quartz任务调度、Hibernate深入浅出系列文章笔记汇总
Spring研磨分析.Quartz任务调度.Hibernate深入浅出系列文章笔记汇总 置顶2017年04月27日 10:46:45 阅读数:1213 这系列文章主要是对Spring.Quartz.H ...
- Android Studio引入AAR文件
一.编译生成AAR文件 二.把AAR文件复制到项目的libs目录下 三.在项目的配置文件中加入如下代码: android { //other code repositories{ flatDir{ d ...