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
as small as possible!
. Output a blank line after every test 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
#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 ...
随机推荐
- uva 508 - Morse Mismatches(摩斯码)
来自https://blog.csdn.net/su_cicada/article/details/80084529 习题4-6 莫尔斯电码(Morse Mismatches, ACM/ICPC Wo ...
- 环形链表II 142 使用快慢指针(C++实现)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...
- 转载:BUG定位
1.web前端 Web前端就是通常说的网页.互联网公司的前端一般包含如下内容:JavaScript.ActionScript.CSS.HTML(..ML).Flash.交互式设计.视觉设计 web前端 ...
- hadoop中的方法的作用
/* * InputFormat类: * * 作用: * 1.设置输入的形式; * 2.将输入的数据按照相应的形式分割成一个个spilts后再进一步拆分成<key,value> ...
- Jmeter——小性能用例
1.添加默认值,将代理服务器写入 2.添加HTTP请求头,将域名部分用变量形式写入:${__CSVRead(D:/number.txt,0)},这是为了查询不同页面,在D:/number.txt路径下 ...
- Spark概念介绍
Spark概念介绍:spark应用程序在集群中以一系列独立的线程运行,通过驱动器程序(Driver Program)发起一系列的并行操作.SparkContext对象作为中间的连接对象,通过Spark ...
- Python 3.6 爬取BD电影网
2018-07-10 #coding:utf-8 #coding:utf-8 from lxml import etree import requests import pandas import t ...
- MVC项目用Windsor注入
第一步创建controler 注入类 public class ApiControllersInstaller : IWindsorInstaller { public void Install(I ...
- 以太坊 生成助记词和infuru插件
https://iancoleman.io/bip39/ https://infura.io google faucet : https://faucet.rinkeby.io/ 登录google账号 ...
- [leetcode-646-Maximum Length of Pair Chain]
You are given n pairs of numbers. In every pair, the first number is always smaller than the second ...