hdu3437 划分树 区间内小于第K大的值得和
Minimum Sum
Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3769 Accepted Submission(s): 872

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 1000000001
#define MOD 1000000007
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pi acos(-1.0)
using namespace std;
const int MAXN = ;
int num[][MAXN],cnt[][MAXN],sor[MAXN],n,leftnum;
ll sum[][MAXN],leftsum,all[MAXN];//sum记录第d层 第i个数之前小于sor[m]的和
void build(int l,int r,int d)
{
if(l == r){
return ;
}
int m = (l + r) >> ;
int same_m = m - l + ;
for(int i = l; i <= r; i++){
if(num[d][i] < sor[m])same_m --;
}
int cnt_small = ;
int pl,pr;
ll val = ;
pl = l,pr = m + ;
for(int i = l; i <= r; i++){
if(num[d][i] < sor[m]){
cnt_small ++;
val += num[d][i];
sum[d][i] = val;
cnt[d][i] = cnt_small;
num[d+][pl++] = num[d][i];
}
else if(num[d][i] == sor[m] && same_m){
same_m --;
cnt_small ++;
val += num[d][i];
sum[d][i] = val;
cnt[d][i] = cnt_small;
num[d+][pl++] = num[d][i];
}
else {
sum[d][i] = val;
cnt[d][i] = cnt_small;
num[d+][pr++] = num[d][i];
}
}
build(l,m,d+);
build(m+,r,d+);
}
ll query(int L,int R,int k,int l,int r,int d)
{
if(l == r){
return num[d][l];
}
int m = (l + r) >> ;
int s,ss;
ll val = ;
if(l == L)s = , val = sum[d][R];
else s = cnt[d][L-], val = sum[d][R] - sum[d][L-];
ss = cnt[d][R] - s;
if(ss >= k){
int newl = l + s;
int newr = l + s + ss - ;
return query(newl,newr,k,l,m,d+);
}
else {
leftnum += ss;//进入左孩子不用处理,进入右孩子时 就要加上左孩子的值
leftsum += val;
int a = L - l - s;
int b = R - L + - ss;
int newl = m + + a;
int newr = m + + a + b - ;
return query(newl,newr,k - ss,m+,r,d+);
}
}
int main()
{
int t,ff = ;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
memset(all,,sizeof(all));
memset(num,,sizeof(num));
for(int i = ; i <= n; i++){
scanf("%d",&num[][i]);
sor[i] = num[][i];
all[i] = all[i-] + sor[i];
}
sort(sor + ,sor + n + );
build(,n,);
int q,x,y;
scanf("%d",&q);
printf("Case #%d:\n",++ff);
while(q--){
scanf("%d%d",&x,&y);
x += ;
y += ;
int len = (y - x + );
ll tp;
leftnum = ;
leftsum = ;
if(len % ){
int k = (len + ) >> ;
tp = query(x,y,k,,n,);
}
else {
int k = len >> ;
tp = query(x,y,k,,n,);
}
//cout<<tp<<' '<<leftnum<<' '<<leftsum<<' '<<all[y]<<' '<<all[x+leftnum]<<endl;
ll ans = tp * (leftnum + ) - (leftsum + tp) + (all[y] - all[x - ] - (leftsum + tp)) - (y - x + - (leftnum + )) * tp;
printf("%lld\n",ans);
}
printf("\n");
}
return ;
}
hdu3437 划分树 区间内小于第K大的值得和的更多相关文章
- HDU5107---K-short Problem (线段树区间 合并、第k大)
题意:二维平面上 N 个高度为 Hi 建筑物,M次询问,每次询问输出 位于坐标(x ,y)左下角(也就是xi <= x && yi <= y)的建筑物中的第k高的建筑物的高 ...
- LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))
#6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给 ...
- LOJ #6278. 数列分块入门 2-分块(区间加法、查询区间内小于某个值x的元素个数)
#6278. 数列分块入门 2 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 6 题目描述 给出 ...
- HDU 5249 离线树状数组求第k大+离散化
KPI Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 如何用快排思想在O(n)内查找第K大元素--极客时间王争《数据结构和算法之美》
前言 半年前在极客时间订阅了王争的<数据结构和算法之美>,现在决定认真去看看.看到如何用快排思想在O(n)内查找第K大元素这一章节时发现王争对归并和快排的理解非常透彻,讲得也非常好,所以想 ...
- HDU 4417 (划分树+区间小于k统计)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给定一个区间,以及一个k值,求该区间内小于等于k值的数的个数.注意区间是从0开始的 ...
- poj2104 划分树 区间K大 在线 无修改
博主sbit....对于高级数据结构深感无力,然后这些东西在OI竟然烂大街了,不搞就整个人都不好了呢. 于是我勇猛的跳进了这个大坑 ——sbit 区间K大的裸题,在线,无修改. 可以用归并树(\(O( ...
- SDUT 2610 Boring Counting(离散化+主席树区间内的区间求和)
Boring Counting Time Limit: 3000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descriptio ...
- HDU 4417 Super Mario(划分树问题求不大于k的数有多少)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- openjudge8469特殊密码锁[贪心]
描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转.当然,如果你 ...
- 开启云时代,银狐H5游戏云通迅框架解决方案出炉!
没有时间开发服务器? 不懂服务器开发? 还在为WEB SOCKET烦恼?还在为网络卡,负载承受能力小烦恼? 银狐H5游戏云通迅框架,集成通讯SDK和开放API,1天即可完成 它也是开放平台,提供游戏需 ...
- 如何配置QuickFIX/N
Acceptor或者Initiator能够为您维护尽可能多的FIX会话,因而FIX会话标识的唯一性非常重要.在QuickFIX/N中,一个FIX会话的唯一标识是由:BeginString(FIX版本号 ...
- [No00001D]解决5个问题,马上开口说英语
- 持久化存储——偏好设置,plist,归档---学习笔记二
//一. 本地持久化 //1.沙盒 //1.1 应用程序包:存放的是应用程序的源文件,包括资源文件和可执行文件 NSString *path = [[NSBundle mainBundle]bundl ...
- 10 Things Every Java Programmer Should Know about String
String in Java is very special class and most frequently used class as well. There are lot many thin ...
- SQL 按特定字段值排序
SQL 按特定字段值排序的代码,有需要的朋友可以参考下. id, name shandong01 name1 shandong02 name2 shandong03 name3 beijing01 n ...
- [转]❲阮一峰❳Linux 守护进程的启动方法
❲阮一峰❳Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 ...
- NOI2018准备Day2
昨天雄心壮志了一番,今天就有点儿松懈了,是生于忧患,死于安乐吗 刷了15道大水题,5道字符串,5道多维数组,5道顺序查找,9个小时,平均40分钟一道水题,目标10分钟一道......昨天才刷了20道. ...
- C# 生成windows 服务打包程序
c# 开发windows服务程序. 一个简单的服务程序示例. 归纳了几点.有不足之处,请赐教. 一.创建服务程序 1. 菜单栏“文件”--->“新建”--->“项目”,在项目类型中选择“w ...