hdu3473 线段树 划分树
//Accepted 28904 KB 781 ms
//划分树
//所求x即为l,r区间排序后的中位数t
//然后求出小于t的数的和sum1,这个可以用划分树做
//求出整个区间的和sum,可以用O(1)的数组做
//ans=(k-1)*t-sum1+sum-sum1-(l-r+1-k+1)*t
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
/**
* This is a documentation comment block
* 如果有一天你坚持不下去了,就想想你为什么走到这儿!
* @authr songt
*/
;
struct node
{
int val[imax_n];
int num[imax_n];
__int64 sum[imax_n];
}f[];
int a[imax_n];
__int64 all[imax_n];
int sorted[imax_n];
int n;
void build(int t,int l,int r)
{
if (l==r) return ;
;
;
;
for (int i=l;i<=r;i++)
{
if (f[t].val[i]<sorted[mid]) isame--;
}
int ln=l;
;
for (int i=l;i<=r;i++)
{
if (i==l)
{
f[t].num[i]=;
f[t].sum[i]=;
}
else
{
f[t].sum[i]=f[t].sum[i-];
f[t].num[i]=f[t].num[i-];
}
if (f[t].val[i]<sorted[mid])
{
f[t].num[i]++;
f[t].sum[i]+=f[t].val[i];
f[t+].val[ln++]=f[t].val[i];
}
else if (f[t].val[i]>sorted[mid])
{
f[t+].val[rn++]=f[t].val[i];
}
else
{
if (same<isame)
{
same++;
f[t].num[i]++;
f[t].sum[i]+=f[t].val[i];
f[t+].val[ln++]=f[t].val[i];
}
else
{
f[t+].val[rn++]=f[t].val[i];
}
}
}
build(t+,l,mid);
build(t+,mid+,r);
}
__int64 sum=;
int lnum;
int query(int t,int l,int r,int a,int b,int k)
{
int s,ss;
if (l==r) return f[t].val[l];
;
__int64 tsum=;
if (a==l)
{
ss=;
s=f[t].num[b];
tsum=f[t].sum[b];
}
else
{
ss=f[t].num[a-];
s=f[t].num[b]-ss;
tsum=f[t].sum[b]-f[t].sum[a-];
}
if (s>=k)
{
a=l+ss;
b=l+ss+s-;
,l,mid,a,b,k);
}
else
{
//lnum+=s;
int b1=a-l-ss;
-s;
a=mid++b1;
b=mid+b1+b2;
sum+=tsum;
,mid+,r,a,b,k-s);
}
}
int Q;
int x,y;
void slove()
{
build(,,n);
scanf("%d",&Q);
;i<=Q;i++)
{
scanf("%d%d",&x,&y);
x++;
y++;
__int64 sum1=all[y]-all[x-];
//printf("sum1=%I64d\n",sum1);
sum=;
//lnum=0;
//printf("sum=%I64d\n",sum);
-x+;
,,n,x,y,k);
//printf("t=%d\n",t);
lnum=k-;
__int64 ans=-sum+sum1-sum-(__int64 )(y-x+-lnum-lnum)*t;
printf("%I64d\n",ans);
}
}
int main()
{
int T;
;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
all[]=;
;i<=n;i++)
{
scanf("%d",&a[i]);
f[].val[i]=sorted[i]=a[i];
all[i]=all[i-]+a[i];
}
printf("Case #%d:\n",++t);
sort(sorted+,sorted+n+);
slove();
printf("\n");
}
;
}
hdu3473 线段树 划分树的更多相关文章
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- poj2104 线段树 划分树
学习:http://www.cnblogs.com/pony1993/archive/2012/07/17/2594544.html 划分树的build: 划分树是分层构建的,在构建的t层时,我们可以 ...
- poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 43315 Accepted: 14296 Ca ...
- POJ 题目2761 Feed the dogs(主席树||划分树)
Feed the dogs Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 16860 Accepted: 5273 De ...
- poj 2104 K-th Number (划分树入门 或者 主席树入门)
题意:给n个数,m次询问,每次询问L到R中第k小的数是哪个 算法1:划分树 #include<cstdio> #include<cstring> #include<alg ...
- sdut 2610:Boring Counting(第四届山东省省赛原题,划分树 + 二分)
Boring Counting Time Limit: 3000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 In this problem you a ...
- 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))
函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...
- HDU 4417 (划分树+区间小于k统计)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给定一个区间,以及一个k值,求该区间内小于等于k值的数的个数.注意区间是从0开始的 ...
- POJ2104 k-th number 划分树
又是不带修改的区间第k大,这次用的是一个不同的方法,划分树,划分树感觉上是模拟了快速排序的过程,依照pivot不断地往下划分,然后每一层多存一个toleft[i]数组,就可以知道在这一层里从0到i里有 ...
随机推荐
- linux gcc 编译动态类库(.so)和静态类库(.a)
linux gcc 编译动态类库(.so)和静态类库(.a) 我的编译环境 ubuntu desktop 16.04 一:测试代码 测试有3个文件:AB.h,AB.c,test.c //AB.h vo ...
- 【转】 Live555
Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编 ...
- 常用SQL语句(交互)
%-------通配符 select * from [EMoney_Club].[dbo].[GoldIdea_AdviceCollect] where [Content] like '%昵称%' s ...
- bootstrap的警告框
.alert 基础警告框 .alert-danger 红色警告框 .alert-dismissable 修饰警告框 alert-dismiss="alert" 触发警告框 // ...
- 百度Tera数据库介绍——类似cassandra,levelDB
转自:https://my.oschina.net/u/2982571/blog/775452 设计背景 百度的链接处理系统每天处理万亿级的超链数据,在过去,这是一系列Mapreduce的批量过程,对 ...
- noip知识点总结之--线性筛法及其拓展
一.线性筛法 众所周知...线性筛就是在O(n)的时间里找出所有素数的方法 code: void get_prime(int N){ int i, j, k; memset(Flag, ); ; i ...
- PDF 补丁丁 0.4.1.688 测试版发布(请务必用其替换 682 测试版)
修复了测试版682 损坏书签.读取字符宽度表出错的问题.请下载了旧测试版的网友马上换用新的测试版.
- linux命令行快捷键
linux命令行编辑快捷键 先总结几个个人觉得最有用的 ctrl + ? 撤消前一次输入 ctrl + c 另起一行 ctrl + r 输入单词搜索历史命令 ctrl + u 删除光标前面所有字符相当 ...
- [Js]封装好的通过className来获取元素的函数
<div id="box"> <div class="star"></div> <div class="st ...
- hdu 4606 Occupy Cities
http://acm.hdu.edu.cn/showproblem.php?pid=4606 两点之间如果有线段相隔的话,他们的最短路就需要经过线段的端点 把所有线段的端点也加入点数组中,求任意两个点 ...