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里有 ...
随机推荐
- 能源项目xml文件标签释义--CommonsMultipartResolver
<!-- 文件上传表单的视图解析器 --><bean id="multipartResolver" class="org.springframework ...
- node下新建工程
打开控制台 输入express --view ejs 成功后有 输入cnpm install 成功后有 查看下现在的json文件,如图 用数据库的话可以键入 cnpm install --save m ...
- BliBli抢楼全攻略
B站抢楼是一个很好玩的事情,每当新番出新集时.总有很多人想能够在前排发表评论,但是因为人数众多,往往不能如愿,今天就教大家一个抢楼的好办法. 我们平时抢楼的整个流程是这样的: 1.在官方放出的新番更新 ...
- (转)SqlServer将数据库中的表复制到另一个数据库
本文为转载地址为:http://jingyan.baidu.com/article/d5c4b52bc5c102da570dc547.html 复制表结构 在使用SqlServer的过程中,我们可能需 ...
- springMVC系统异常处理及自定异常处理
配置系统异常处理器 1.后台模拟一个异常 @RequestMapping(value = "/myexception.do", produces = "text/html ...
- 318. Maximum Product of Word Lengths ——本质:英文单词中字符是否出现可以用26bit的整数表示
Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...
- dll和ocx比较
ActiveX,OLE是基于COM的一种应用,其文件后缀一般以dll和ocx结尾:ocx作为一种特殊的dll文件,具有一定的用户界面和事件响应,而dll文件只是方法和属性的集合. 一.关于DLL的介绍 ...
- getWritableDatabase()与getReadableDatabase()方法
一旦在程序中得到了SQLiteOpenHelper对象之后,程序无须使用SQLiteDatabase的静态方法创建SQLiteDatabase实例,而且可以使用getWritableDatabase( ...
- jQuery中的quickExpr
jQuery 源码中的 quickExpr 是用来检测参数 selector 是否是复杂的 HTML 代码(如“abc<div>”)或 #id,匹配结果存放在数组 match 中 // A ...
- POJ 3274 Gold Balanced Lineup 哈希,查重 难度:3
Farmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been able to narrow ...